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)'
столбцами, из которых взяты значения для расчета баланса
Когда Вы выходите из системы, во-первых, Вы ставите разрушение в очередь cookie (это произойдет после того, как ответ будет отправлен), затем сразу после, представляя Вашу страницу. Браузер не имеет никакого шанса удалить cookie перед рендерингом и Вашим $_SESSION
переменные все еще живы.
В документах PHP говорится о session_destroy
:
session_destroy () уничтожает все данные, связанные с текущей сессией. Это не сбрасывает ни одной из глобальных переменных, связанных с сессией, или сбросило сеансовые куки.
Решение к, вместо того, чтобы уничтожить сессию и cookie, просто сбросьте переменные, которые вызвали бы аутентификацию:
unset($_SESSION['user']);
unset($_SESSION['lastActive']);
unset($_SESSION['fingerprint']);
Просто примечание: Я предложил бы разделить Ваш код на функции. Это сделало бы его намного более организованным и читаемым (и допускающий повторное использование, если Вы делаете вещи правильно).
$_SERVER['REMOTE_ADDR']
мог измениться, если пользователь находится позади прокси.
$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;
}
Используйте соль наряду с 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 значения. Первое значение называют 'соленым', и второе значение является зашифрованным паролем. Сохраните их обоих в базу данных.
Когда кто-то пытается войти в Ваш сайт, и Вы хотите проверить, отправить их пароль и соленую переменную к функции, и это возвратит хеш. Затем можно сравнить это со значением, сохраненным в базе данных, чтобы проверить, является ли пароль, введенный пользователем, правильным.
Это выглядит хорошо. setcookie(session_name(), '', time()-3600, '/')
по существу удаляет cookie путем установки времени на перед текущим временем.
Некоторые примечания по безопасности::
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 данных (который, вероятно, не является тем, что Вы хотите!).
В этом случае необходимо удостовериться, что у Вас есть свои настройки сервера, корректны для mysql_real_escape_string
работать правильно. В этом случае Ваш код предполагает, что Волшебные Кавычки выключены, тогда как я часто нахожу, что многим серверам включили его. Необходимо, вероятно, проверять, чтобы видеть если get_magic_quotes_gpc()
TRUE или FALSE возвратов, чтобы видеть, выходят ли настройки сервера автоматически из строк для Вас.
Код выглядит безопасным, но я предложил бы изучить новый способ сделать запросы MySQL: PDO. Это допускает параметризированные запросы.
MD5 является довольно слабым средством зашифровать пароль и существует много способов обойти его. Это действительно помогает, однако что у Вас есть он установка с IP-адресом, но дюйм/с, конечно, изменяется вполне немного.
Кроме того, у Вас нет ничего там, чтобы удостовериться, что кто-то не поражает систему много раз для повреждения пароля для пользователя.
G-человек
Вы могли использовать этот метод, описанный Nate Abele для улучшения, надежность информации раньше создавала цифровой отпечаток.
Что делает setcookie (session_name ()", время ()-3600, '/');
Похоже, что это стирает старые сеансовые куки путем установки пустой строки на него и путем установки времени истечения срока в прошлом. Не уверенный, почему автор использовал оба метода, все же.