SQL — Инъекции

От автора:если у вас применяется ввод данных пользователем через веб-страницу с последующей их вставкой в базу данных SQL, существует вероятность, что у вас могут возникнуть проблемы с безопасностью. Связано это с таким явлением, как SQL инъекция. В этой главе мы рассмотрим, как решить данную проблему, и защитить ваши скрипты и инструкции SQL в скриптах на стороне сервера, например, PERL Script

Инъекция обычно осуществляется, когда вы запрашиваете у пользователя определенные данные, например имя, а вместо этого он вводит инструкцию SQL, которая несанкционированно выполняется в базе данных. Предоставленные пользователем данные всегда должны обрабатываться в базе данных только после их валидации. Как правило, она выполняется путем сопоставления с шаблонами.

В приведенном ниже примере для name могут использовать только буквенно-цифровые символы плюс подчеркивание и оно может иметь в длину от 8 до 20 символов (при необходимости вы можете изменить эти правила).

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) {
 $result = mysql_query("SELECT * FROM CUSTOMERS 
 WHERE name = $matches[0]");
} else {
 echo "user name not accepted";
}

Давайте рассмотрим следующий пример:

// supposed input
$name = "Qadir'; DELETE FROM CUSTOMERS;";
mysql_query("SELECT * FROM CUSTOMSRS WHERE name='{$name}'");

Предполагается, что вызов функции должен получить запись из таблицы CUSTOMERS, где столбец name соответствует имени, указанному пользователем. Обычно $name содержит только буквенно-цифровые символы и, возможно, пробелы. Но здесь к $name добавляется совершенно новый запрос, который при выполнении вызывает катастрофические последствия; DELETE-запрос удаляет все записи из таблицы CUSTOMERS.

К счастью, если вы используете MySQL, функция mysql_query() не допускает стекирование запросов или выполнение нескольких SQL-запросов в одном вызове функции. Если вы попытаетесь выполнить стек запросов, вызов завершится ошибкой.

Тем не менее, другие расширения базы данных PHP, такие как SQLite и PostgreSQL, принимают стекированые запросы, выполняя все запросы в одной строке, что приводит к серьезным проблемам с безопасностью.

Предотвращение SQL-инъекций

Вы можете контролировать ввод символов escape с помощью скриптовых языков, таких как PERL и PHP. Расширение MySQL для PHP предоставляет функцию mysql_real_escape_string(), которая предотвращает ввод символов, имеющих в MySQL особое значение.

if (get_magic_quotes_gpc()) {
 $name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query("SELECT * FROM CUSTOMERS WHERE name='{$name}'");

Проблемы связанные с LIKE

Чтобы не допускать проблем, связанных с LIKE, пользовательский механизм экранирования должен преобразовывать символы «%» и «_» в их буквальные соответствия. Для этого используется функция addcslashes(), которая позволяет указать диапазон символов для экранирования.

$sub = addcslashes(mysql_real_escape_string("%str"), "%_");
// $sub == \%str\_
mysql_query("SELECT * FROM messages 
 WHERE subject LIKE '{$sub}%'");

Источник://www.tutorialspoint.com/

Редакция:Команда webformyself.

Поделится

Добавить комментарий

Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять