Простое решение для инъекции SQL для форм входа? - PullRequest
1 голос
/ 30 марта 2012

Я видел несколько примеров, и люди использовали этот способ для запроса базы данных в форме входа в систему.Я не до конца уверен, что это лучший способ обезопасить форму входапост, чтобы избежать инъекций sql?Я думаю, что функция md5 преобразует все символы и строки sql в строку из 32 символов.

Какими еще способами можно защитить форму входа?

Ответы [ 7 ]

6 голосов
/ 30 марта 2012

mysql_real_escape_string($_POST['username']) и т. Д.

Хотя лучше использовать расширение mysqli и использовать подготовленные операторы.

(Предполагается, что вы используете MySQL)

Редактировать: В ответ на комментарий ниже, было бы полезно использовать это для LIKE запросов:

addcslashes(mysql_real_escape_string($_POST['username']), '%_')

0 голосов
/ 27 сентября 2014

Только одно простое решение использует параметры для таких полей, как имя пользователя и пароль, чтобы строка команды SQL отдельно отправлялась из параметров, и тогда злоумышленник получит только пустые ответы. При использовании параметров строка команды SQL анализируется и компилируется отдельно от параметров , Использование подготовленных заявлений - лучшее решение.

0 голосов
/ 30 марта 2012
<?php

try {
    $dbh = new PDO("mysql:host=$hostname;dbname=$db", $dbusername, $dbpassword);

    $query = "SELECT * FROM users WHERE usern = ? AND passw = ?";
    $sth=$dbh->prepare($sql);
    $sth->execute(array($_POST['username'], md5($_POST['password']));
    $result =  $sth->fetch();
}
} catch(PDOException $e) {
    echo $e->getMessage();
    exit;
}

PDO - это Лучший способ остановить SQL-инъекцию в PHP

0 голосов
/ 30 марта 2012

Если вы делаете функцию, которая дезинфицирует все ПОЧТЫ и ПОЛУЧАЕТ, вы в безопасности

function clean() { 
    foreach($_POST as $key => $val) { 
        $_POST[$key] = mysql_real_escape_string($val);
    } 
}

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

0 голосов
/ 30 марта 2012

То, как вы создали свой запрос, позволяет легко вводить фрагменты кода в имени пользователя.Вы можете использовать подготовленные операторы, чтобы избежать этого: http://php.net/manual/en/pdo.prepared-statements.php

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

0 голосов
/ 30 марта 2012

Вам также нужно сбежать $_POST['username']

, и да md5 защитит вас от инъекции sql.

Для этого примера, что-то вроде этого будет хорошо

$query = "SELECT * FROM users WHERE MD5(usern) = '".md5($_POST['username'])."' AND passw = '".md5($_POST['password'])."'";
0 голосов
/ 30 марта 2012

Вы должны очистить данные, прежде чем размещать их рядом с базой данных.Самый простой способ сделать это - использовать mysql_real_escape_string($_POST['username']), но это только самое малое, что вам нужно сделать.

Если вы используете фреймворк, такой как CodeIgniter, вы можете использовать их встроенную функциональность, которая удаляетВходы $ _POST или $ _GET любого риска XSS.В противном случае, я бы порекомендовал эти сообщения:

...