PHP AJAX логин, этот метод безопасен? - PullRequest
4 голосов
/ 26 июля 2010

Я только что запустил 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.

Ответы [ 5 ]

5 голосов
/ 26 июля 2010

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

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);

Вам также нужно ввести пароль.

5 голосов
/ 26 июля 2010

страдает от

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

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

1 голос
/ 13 августа 2012

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

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

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

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

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