2014-02-18 3 views
0

Я новичок в PHP. Я выполняю аутентификацию, где я проверяю пароль с паролем, хранящимся в базе данных PostgreSQL. На дб сайте я использовал эту функцию, чтобы склеп мой пароль:php crypt password и postgresql database

update ucty set psswd = crypt('some_pswd',gen_salt('md5')) where uid='1'; 

В моем PHP srcipt Я использую этот код:

$query = "SELECT meno, priezvisko, nickname, psswd, uid 
      FROM ucty 
      where nickname='$nickname' and psswd=crypt('$password', psswd)"; 

Все отлично работает, но я не уверен, что это это правильный способ защитить мой пароль.

Любые советы?

+2

У вас есть инъекции SQL уязвимость. – SLaks

ответ

2

Вы правы; этот не является правильным способом для защиты вашего пароля.

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

    «Как я могу предотвратить это?» Сделайте свое хеширование на стороне сервера, в вашем PHP-коде. Вы можете читать this в руководстве по PHP.

    По сути, вы хотите, чтобы ваш запрос, чтобы установить пароль быть что-то вроде этого:

    UPDATE ucty SET psswd=$hashed WHERE uid=1; 
    
  • Ты ставишь переменные непосредственно в инструкцию SQL. Вы не указали, какой метод вы используете для запроса базы данных, но вы хотите использовать prepared statements. Это безопасный способ перемещения по пользовательским данным (которые $nickname и $password).

    Это будет примером хороший способ, чтобы использовать подготовленные заявления:

    $query = "SELECT meno, priezvisko, nickname, psswd, uid" 
        . " FROM ucty" 
        . " WHERE nickname=? and psswd=?"; 
    
    $stmt = $dbh->prepare($query); 
    $stmt->execute(array($nickname, $hashedPassword)); 
    
+0

Вы предполагаете, что соединение между PHP и базой данных (a) по сети и (б) небезопасно, и даже если это так, злоумышленник все равно должен будет взломать LAN, на которой находятся серверы. – Quentin

+0

@Quentin - Учитывая вопрос до сих пор, разве это не безопасное или разумное предположение? И в любом случае журнал PostgreSQL может иметь открытый текстовый журнал. –

+0

На самом деле я согласен с вашим ответом, но проверка не может быть выполнена с таким запросом из-за соли. Вместо этого пароль-хэш можно получить с помощью «SELECT psswd FROM ucty WHERE nickname =?», А затем вы можете проверить результат с помощью [password_verify()] (http://www.php.net/manual/en/function .password-verify.php). – martinstoeckli