Я только что начал 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);
Вам также необходимо солить пароль.
Он страдает от
Также никогда не сообщайте пользователям такие вещи, как «пользователь не существует» или «неправильный пароль». Гораздо лучше, если вы просто распечатаете «Неправильное имя пользователя или пароль», чтобы все не могли проверить существующие имена пользователей, а затем попытаться угадать пароль для них.
session_register () устарел, вы должны использовать $ _SESSION [].
Вы также выполняете свои строковые escape-последовательности в хэшированной строке пароля $ pass; он всегда будет иметь шестнадцатеричное значение, и поэтому его не нужно избегать. Вы можете выполнять escape-строки в строке пароля до хэша, но это лишь незначительно полезно (например, если вы позволили кодам-фразам сохранять пользователей, которые включали символы, которые нужно было экранировать). Обычно я запрещаю это на стороне регистрации кода) , Вы также должны использовать соль.
Основываясь на моих исследованиях: