Предложили сделать веб-проект который будет торчать наружу. Делаю авторизацию. Какие есть потенциальные уязвимости в таком подходе?
Для каждого пользователя системы в mysql-табличке хранится логин, хэш-пароля(от соли) и сама соль. Также есть пустые поля под CURRENT_IP, CURRENT_USER_AGENT и CURRENT_HASH.
При заходе на страничку login.php
пользователь вводит свои логин и пароль;
Логин и пароль обрабатываем preg_match - проверяем, чтобы были только буквы и цифры;
Делаем запрос к базе через adodb (там есть плейсхолдеры);
Если есть такой логин, берем из базы соль, хэшируем соль+пользовательский пароль, проверяем совпадение получившегося хэша с хэшем из базы;
Если всё окей, создаем CURRENT_HASH - любая строка, например md5(time() + "123")
, заносим её в базу и кладем в $_COOKIES
. Также заносим в базу CURRENT_IP = текущий адрес пользователя
и CURRENT_USER_AGENT = md5(от текущего значения user-agent пользователя)
;
При заходе на любую страницу сайта (где требуется авторизация) подключаем файл auth.php
со следующим содержимым:
$my_current_hash = $_COOKIES['CURRENT_HASH']
$sql = "
SELECT `USER_ID`, `CURRENT_HASH`, `CURRENT_USER_AGENT`, INET_NTOA(`CURRENT_IP`) as `CURRENT_IP_NTOA`
FROM `users`
WHERE (`CURRENT_HASH` = %s") AND (`CURRENT_IP_NTOA` = %s)
AND (`CURRENT_USER_AGENT` = %s);
// fetchRow из adodb
$res = fetchRow($sql, $my_current_hash, $_SERVER['REMOTE_ADDR'],
md5($_SERVER['HTTP_USER_AGENT']));
if ($res)
echo "success";
else {
Header('location: you_suck.php');
exit();
}
Достаточно ли такого подхода для обеспечения безопасности веб-приложения?