Умирает любовь от усталости, а хоронит ее забвение (Ж. Лабрюйер).

SQL – инъекция

2 мин для чтения
FavoriteLoadingДобавить в избранное
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
25 апреля 2017
SQL - инъекция
Если взять ввод данных пользователя через веб – страницу и вставить его в базу данных SQL, есть шанс, что вы оставили открытыми ворота для проблемы безопасности, известной как SQL Injection. Эта глава покажет вам, как помочь предотвратить это и поможет вам защитить ваши скрипты и операторы SQL в скриптах на вашем сервере, такие как скрипт PERL.

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

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

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) {
   $result = mysql_query("SELECT * FROM CUSTOMERS 
      WHERE name = $matches[0]");
} else {
   echo "имя пользователя не принято";
}

 

Чтобы продемонстрировать эту проблему, рассмотреть этот отрывок:

// предполагаемый ввод
$name = "Qadir'; DELETE FROM CUSTOMERS;";
mysql_query("SELECT * FROM CUSTOMSRS WHERE name='{$name}'");

 

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

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

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

Предотвращение SQL Injection

Вы можете обрабатывать все спецсимволы в скриптовых языках, таких как 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}%'");

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Просмотров: 159

Если статья понравилась, то поделитесь ей в социальных сетях:

Читайте также

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

    Войти с помощью: 

    Ваш e-mail не будет опубликован. Обязательные поля помечены *

    Сообщить об опечатке

    Текст, который будет отправлен нашим редакторам:

    Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!

    badge
    Обратный звонок 1
    Отправить
    galka

    Спасибо! Ваша заявка принята

    close
    galka

    Спасибо! Ваша заявка принята

    close