Безопасен ли этот фрагмент кода - PHP && MySQL
-
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" в переменной и сравнил его вне запроса.