Вход в PHP AJAX, этот метод безопасен?

Я только что начал PHP и mySQL и должен знать, является ли это «безопасным». Информация для входа передается в следующий файл PHP через AJAX (jQuery).

jQuery AJAX

$("#login_form").submit(function(){ $.post("login.php",{user:$('#username').val(),pass:$('#password').val()} ,function(data) 

PHP

 ob_start(); mysql_connect("-", "-", "-") or die("ERROR. Could not connect to Database."); mysql_select_db("-")or die("ERROR. Could not select Database."); //Get Username and Password, md5 the password then protect from injection. $pass = md5($pass); $user = stripslashes($user); $pass = stripslashes($pass); $user = mysql_real_escape_string($user); $pass = mysql_real_escape_string($pass); //See if the Username exists. $user_result=mysql_query("SELECT * FROM users WHERE username='$user'"); $user_count=mysql_num_rows($user_result); if($user_count==1){ if($pass_length==0){ echo "userVALID"; } else{ $pass_result=mysql_query("SELECT * FROM users WHERE username='$user' and password='$pass'"); $pass_count=mysql_num_rows($pass_result); if($pass_count==1){ session_register("user"); session_register("pass"); echo "passVALID"; } else { echo "passERROR"; } } } else { echo "userERROR"; } ob_end_flush(); 

Я знаю, что это не лучший способ сделать что-то, но я знаю это! Я просто хочу знать, есть ли у него серьезные недостатки безопасности. Это скорее концепция для меня, и поэтому я не включаю SSL.

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

 if(get_magic_quotes_gpc()){ $user = stripslashes($user); $pass = stripslashes($pass); } $user = mysql_real_escape_string($user); $pass = sha256($salt.$pass); 

В первую очередь md5 очень плох. Также md5() и mysql_real_escape_string() являются избыточными. Столкновения возникли в дикой природе. sha1() хотя ослабление все еще намного более безопасно и никаких коллизий не было создано (пока). Лучшим выбором будет sha256 в php или с помощью библиотеки mhash.

 $pass = md5($pass); 

Вам также необходимо солить пароль.

Он страдает от

  • Отправка пароля по незашифрованному соединению (используйте HTTPS, по крайней мере, для отправки имени пользователя и пароля, что защищает пароль от пассивных злоумышленников, но не против активных. Чтобы быть защищенным от активных злоумышленников, вы должны зашифровать все сообщения).
  • Хранение пароля в базе данных (вместо этого нужно сохранить засоленный хеш).

Также никогда не сообщайте пользователям такие вещи, как «пользователь не существует» или «неправильный пароль». Гораздо лучше, если вы просто распечатаете «Неправильное имя пользователя или пароль», чтобы все не могли проверить существующие имена пользователей, а затем попытаться угадать пароль для них.

session_register () устарел, вы должны использовать $ _SESSION [].

Вы также выполняете свои строковые escape-последовательности в хэшированной строке пароля $ pass; он всегда будет иметь шестнадцатеричное значение, и поэтому его не нужно избегать. Вы можете выполнять escape-строки в строке пароля до хэша, но это лишь незначительно полезно (например, если вы позволили кодам-фразам сохранять пользователей, которые включали символы, которые нужно было экранировать). Обычно я запрещаю это на стороне регистрации кода) , Вы также должны использовать соль.

Основываясь на моих исследованиях:

  1. использование jquery ajax для входа в систему настолько же безопасно, как и обычная старая форма. данные всегда отправляются через HTTP-запрос.
    ссылка: ajax safe для входа?
  2. использование SSL (https) в форме входа дает дополнительную безопасность.
  3. вместо использования mysql_connect вы должны использовать подготовленные операторы
    ссылка: почему подготовленное заявление? и пример использования примера использования
  4. вы должны использовать односторонний алгоритм хэширования паролей, такой как Bcrypt. односторонний алгоритм хеширования означает, что вы не можете преобразовать хешированный пароль обратно в обычный текст. но вы можете проверить ключ в пароле с хешированным паролем, хранящимся в базе данных.
    ссылка: не шифруйте пароль, вместо этого используйте hash. и Bcrypt и как его использовать