Безопасен ли этот фрагмент кода - PHP && MySQL - PullRequest
0 голосов
/ 27 мая 2009
<?php
class test_class {

        public function __construct() { 

        }
        public function doLogin($username,$password) {

            include("connection.php");

            $query = "SELECT *
                      FROM users
                      WHERE username = '".mysql_escape_string($username)."'
                      AND password = '".mysql_escape_string($password)."'";
            $result = mysql_fetch_array(mysql_query($query));
            if(!$result) {

            return 'no';
            }
            else 
                {
            return 'yes';
                }
            }


}
?>

Приведенный выше код работает, но его немного беспокоит, безопасен он или нет.

Примечание: я не использую метод POST, поэтому мне нужно получить его в качестве аргументов в функции, и я не могу его использовать.

if (isset($_POST['username']) && isset($_POST['password']))
        {
        $username= $_POST['username'];
        $password= $_POST['password'];

Ответы [ 6 ]

5 голосов
/ 27 мая 2009

Код может быть безопасным, но реализация не очень хорошая. Вы никогда не должны хранить пароль аутентификации в виде открытого текста. Вы должны солить и хешировать его.

Я мог бы потратить час, объясняя, почему, но вы бы лучше просто прочитав это .

4 голосов
/ 27 мая 2009

Сам запрос выглядит безопасным, но если бы вы использовали интерфейс БД, который поддерживал привязку параметров, такой как PDO или Zend_Db, вам не пришлось бы тщательно анализировать каждый оператор SQL.

Кроме того, функции mysql- * в значительной степени устарели; вместо этого вы должны взглянуть на функции mysqli- *.

В качестве стилистического примечания нет смысла в пустом конструкторе, и я бы предложил возвращать логическое значение true или false, а не строковые значения.

Наконец, как уже упоминалось, хранение незашифрованных паролей - плохая идея.

2 голосов
/ 27 мая 2009

эээ .... вы храните незашифрованный пароль? Это наверняка не безопасно. Пароль должен быть хеширован солью, используя что-то вроде sha256. Хранение незашифрованных паролей никогда не является хорошей идеей.

1 голос
/ 27 мая 2009

Сам код выглядит нормально, но главная проблема, которую я вижу, заключается в том, что вы передаете пароли в виде простого текста.

Безопасно ли соединение клиент-сервер (т.е. с использованием SSL) Безопасно ли соединение сервер-база данных

Если в любом случае кто-то может сесть на провод и наблюдать за проходящим трафиком, значит, у вас проблема с безопасностью.

Если бы это был я, я бы определенно имел SSL-соединение между клиентом и сервером.

Я бы позаботился о том, чтобы вы хранили хэш пароля в базе данных.

И я бы изменил ваш код на что-то вроде

//Pseduo Code
SELECT * FROM Table where UserName = $username
Get Row Back
if(MD5Hash($password) == DataRow[Password])
   //Valid
1 голос
/ 27 мая 2009

Нет. Вы не должны хранить необработанный пароль в вашей базе данных. Хранить его в хеше (желательно с солью). Кроме того, подготовленные заявления - лучший выбор, чем сбежать. См. Эту документацию PHP PDO . В качестве дополнительного преимущества (помимо безопасности) они могут быть более эффективными.

0 голосов
/ 27 мая 2009

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

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