PHP лучшая практика по аутентификации пользователей для веб-сайта? - PullRequest
4 голосов
/ 04 мая 2011

Я создал несколько сайтов с очень простым кодом php и пока что все хорошо, но я получаю, что теперь меня беспокоит тема "безопасность". Мне интересно, как лучше всего создать процесс входа в систему / аутентификации в PHP

Вот что я сейчас делаю:

при регистрации пользователь отправляет письмо и пароль пароль будет храниться в mysql как строка md5, так что любой, кроме пользователя, знает это.

при входе пользователя я делаю

SELECT * FROM usertable WHERE email = $emailsubmitted AND pass = md5($passsubmitted)

тогда, если размер полученного массива больше нуля, это означает, что пользователь существует

поэтому я установил

session_start(); 
$_SESSION['logged'] = 'true';
$_SESSION[userid] = userid;

поэтому для каждой страницы, которую просматривает пользователь, я проверим, существует ли переменная сеанса.

НИЖНЯЯ ЛИНИЯ: Интересно, достаточно ли это безопасно и как ее можно улучшить.

Ответы [ 4 ]

3 голосов
/ 04 мая 2011

В вашем операторе SQL есть уязвимость внедрения.(Предполагается, что суффикс «представленный» означает, что для переменной не была выполнена фильтрация.) Если злонамеренный пользователь отправит 'admin@example.com' AND 1=1;-- в качестве адреса электронной почты, он может войти с учетными данными «admin@example.com ", независимо от пароля.Я бы посоветовал обеспечить безопасность ввода в SQL и / или использовать хранимые процедуры.Я бы также предложил загружать только те колонки, которые вам абсолютно необходимы;это улучшит скорость запроса и позволит удерживать меньше состояний вне базы данных.

Дополнительно внедрите посолку на пароле.Если бы кто-то извлек данные пользователя из базы данных, пароли были бы легкой целью для атак грубой силы и словаря (таких как радужные таблицы).Если вы действительно параноик, подумайте о переключении с MD5 на SHA или другую функцию хеширования.

Убедитесь, какие переменные установлены в вашем файле php.ini и установлены ли они на ожидаемые вами значения.В зависимости от этих настроек, присвоение массива $_SESSION также небезопасно.Некоторые старые веб-приложения использовали PHP-функцию, благодаря которой переменные в строке запроса становились глобальными переменными в веб-приложении, что означало, что при выполнении $_SESSION['userid'] = $userid;, если злонамеренный пользователь прикрепил ?userid=1 к своей строке запроса, онстать пользователем с идентификатором пользователя 1, который часто был первым пользователем (или администратором).

1 голос
/ 04 мая 2011

В дополнение к ранее упомянутым SQL-инъекциям я бы рекомендовал не проверять, является ли массив больше нуля, а вместо этого, если массив равен единице.

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

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

В конечном счете, это незначительная вещь, но когда дело доходит до безопасности, каждый маленький бит имеет значение.

1 голос
/ 04 мая 2011

Общая логика в порядке, да.Однако простой md5 пароля не годится.

  • Отсутствие посылки пароля оставляет хэш открытым для поиска в радужной таблице.

  • md5 обычно не считается хорошим механизмом хеширования паролей.Я рекомендую вам взглянуть на http://www.openwall.com/phpass/

Примечание: ваш SQL выглядит как , чтобы быть открытым для внедрения SQL.

0 голосов
/ 17 декабря 2012

Первое, что я хочу отметить, это то, что вы применяете хеш MD5 к переменной php. Это заставляет меня думать, что пароль распространяется по каналу.

Вы должны применить хеш MD5 на стороне клиента с помощью js, например:

http://phpjs.org/functions/md5/

Если вы хотите добавить еще один уровень безопасности, вам также следует рассмотреть возможность использования соли в дополнение к стандартному хешу. Это защитит вас от любой диктиональной атаки или обратного хэша (см .: http://tools.benramsey.com/md5/)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...