Этот код безопасен?

SELECT 'Old quantity' AS OPERATION, ID, OLD_QTY AS Q_IN, NULL AS Q_OUT, BALACNE = 'BALANCE (of previous record) + Q_IN (of current record) - Q_OUT (of current record)' FROM t_PRODS
UNION ALL
SELECT PROVIDER_NAME, PRODUCT_ID, QTY, NULL, NULL FROM t_INS
UNION ALL
SELECT DEPLOYER_NAME, PRODUCT_ID, NULL,NULL, QTY FROM t_OUTS

Примечание. Обязательно замените 'BALANCE (of previous record) + Q_IN (of current record) - Q_OUT (of current record)' столбцами, из которых взяты значения для расчета баланса

.
6
задан Abdulsattar Mohammed 26 January 2009 в 02:08
поделиться

10 ответов

Когда Вы выходите из системы, во-первых, Вы ставите разрушение в очередь cookie (это произойдет после того, как ответ будет отправлен), затем сразу после, представляя Вашу страницу. Браузер не имеет никакого шанса удалить cookie перед рендерингом и Вашим $_SESSION переменные все еще живы.

В документах PHP говорится о session_destroy:

session_destroy () уничтожает все данные, связанные с текущей сессией. Это не сбрасывает ни одной из глобальных переменных, связанных с сессией, или сбросило сеансовые куки.

Решение к, вместо того, чтобы уничтожить сессию и cookie, просто сбросьте переменные, которые вызвали бы аутентификацию:

unset($_SESSION['user']);
unset($_SESSION['lastActive']);
unset($_SESSION['fingerprint']);

Просто примечание: Я предложил бы разделить Ваш код на функции. Это сделало бы его намного более организованным и читаемым (и допускающий повторное использование, если Вы делаете вещи правильно).

7
ответ дан 8 December 2019 в 17:28
поделиться

$_SERVER['REMOTE_ADDR'] мог измениться, если пользователь находится позади прокси.

1
ответ дан 8 December 2019 в 17:28
поделиться

$matchingUser['inactive'] никогда не будет устанавливаться, поскольку Вы не получаете фактические данные из своего дб с mysql_fetch_assoc().

Измененная версия:

$matchingUser = mysql_query("SELECT * FROM `users` WHERE username='$user' AND password=MD5('$password') LIMIT 1");
if (mysql_num_rows($matchingUser))
{
    $matchingUserData = mysql_fetch_assoc($matchingUser);
    if($matchingUserData['inactive'] == 1) //Checks if the inactive field of the user is set to one
    {
        $error = "Your e-mail Id has not been verified. Check your mail to verify your e-mail Id. However you'll be logged in to site with less privileges.";
        $_SESSION['inactive'] = true;
    }
2
ответ дан 8 December 2019 в 17:28
поделиться

Используйте соль наряду с MD5 или sha1. Что я использую, чтобы генерировать пароль и проверить на пароль после входа в систему.

function generateHash($plainText, $salt = null)
{
    define('SALT_LENGTH', 9);
    if ($salt === null)
    {
        $salt = substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH);
    return array($salt, sha1($salt . $plainText) );
    }
    else
    {
        $salt = substr($salt, 0, SALT_LENGTH);
    return sha1($salt . $plainText);
    }

}

За $plainText отправьте в переменной пароля.

Когда Вы захотите генерировать новый хеш, он возвратит 2 значения. Первое значение называют 'соленым', и второе значение является зашифрованным паролем. Сохраните их обоих в базу данных.

Когда кто-то пытается войти в Ваш сайт, и Вы хотите проверить, отправить их пароль и соленую переменную к функции, и это возвратит хеш. Затем можно сравнить это со значением, сохраненным в базе данных, чтобы проверить, является ли пароль, введенный пользователем, правильным.

1
ответ дан 8 December 2019 в 17:28
поделиться

Это выглядит хорошо. setcookie(session_name(), '', time()-3600, '/') по существу удаляет cookie путем установки времени на перед текущим временем.

0
ответ дан 8 December 2019 в 17:28
поделиться

Некоторые примечания по безопасности::

if($matchingUser['inactive'] == 1)

лучше записан как

if(!$matchingUser['inactive'])

Поскольку, если схема базы данных изменяется (например, это - теперь целое число для указания на определенный тип действия (который является плохим дизайном, по-моему: перечисление добилось бы большего успеха)), Ваш код будет иметь проблемы.

Конечно, это - двойное отрицание, которое может быть менее читаемым. Лучше был бы:

if($matchingUser['isactive'])

Или даже:

if($matchingUser->isActive())

принятие Вас создает Пользовательский класс и т.д. и т.д.

На всякий случай используйте или require или require_once в случае необходимости (предпочтительно последний, если connect.php содержит объявления функции).

Сохраните идентификатор пользователя в переменной сеанса вместо имени пользователя. Существует возможность, Вы позволите пользователю менять свое имя позже, и данные сессии были бы недопустимы (по крайней мере, ['user'] был бы, так или иначе). Это также быстрее для нахождения записи базы данных идентификатором (первичный ключ, уникальный), чем это к именем пользователя (возможно, индексировано, строка).

Удар меня после 30 минут является действительно раздражающим. Вы не единственный сайт, в который я перехожу, и я могу пересмотреть позже после выполнения некоторой работы (если я призван, чтобы сделать что-то, например, или взять обеденный перерыв).

Использовать htmlspecialchars помочь предотвратить XSS.

Никакая потребность использовать $_SERVER['PHP_SELF'] здесь:

<a href="' . $_SERVER["PHP_SELF"] . '?logout=true">

Просто запишите без него:

<a href="?logout=true">

Когда пользователь ОТПРАВИТ что-то, удостоверьтесь, что перенаправили их (TODO: отметьте как). Иначе кнопка "Назад" пользователя может вызвать переPOST данных (который, вероятно, не является тем, что Вы хотите!).

2
ответ дан 8 December 2019 в 17:28
поделиться

В этом случае необходимо удостовериться, что у Вас есть свои настройки сервера, корректны для mysql_real_escape_string работать правильно. В этом случае Ваш код предполагает, что Волшебные Кавычки выключены, тогда как я часто нахожу, что многим серверам включили его. Необходимо, вероятно, проверять, чтобы видеть если get_magic_quotes_gpc() TRUE или FALSE возвратов, чтобы видеть, выходят ли настройки сервера автоматически из строк для Вас.

Код выглядит безопасным, но я предложил бы изучить новый способ сделать запросы MySQL: PDO. Это допускает параметризированные запросы.

0
ответ дан 8 December 2019 в 17:28
поделиться

MD5 является довольно слабым средством зашифровать пароль и существует много способов обойти его. Это действительно помогает, однако что у Вас есть он установка с IP-адресом, но дюйм/с, конечно, изменяется вполне немного.

Кроме того, у Вас нет ничего там, чтобы удостовериться, что кто-то не поражает систему много раз для повреждения пароля для пользователя.

G-человек

1
ответ дан 8 December 2019 в 17:28
поделиться

Вы могли использовать этот метод, описанный Nate Abele для улучшения, надежность информации раньше создавала цифровой отпечаток.

0
ответ дан 8 December 2019 в 17:28
поделиться

Что делает setcookie (session_name ()", время ()-3600, '/');

Похоже, что это стирает старые сеансовые куки путем установки пустой строки на него и путем установки времени истечения срока в прошлом. Не уверенный, почему автор использовал оба метода, все же.

0
ответ дан 8 December 2019 в 17:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: