Безопасен ли этот фрагмент кода - PHP && MySQL

StackOverflow https://stackoverflow.com/questions/915057

  •  06-09-2019
  •  | 
  •  

Вопрос

<?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'];
Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

//Pseduo Code
SELECT * FROM Table where UserName = $username
Get Row Back
if(MD5Hash($password) == DataRow[Password])
   //Valid

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top