Как MySQL предотвращает внедрение sql? Принцип и предотвращение SQL-инъекций

MySQLКак предотвратить sql-инъекцию? Принцип и предотвращение SQL-инъекций

MySQL и SQL-инъекция

Если вы берете данные, введенные пользователем через веб-страницу, и вставляете их вБаза данных MySQL, то могут возникнуть проблемы с безопасностью SQL-инъекций.

Эта глава познакомит вас с тем, как предотвратить внедрение SQL и использовать сценарии для фильтрации введенных символов в SQL.

Так называемая SQL-инъекция заключается в том, чтобы заставить сервер выполнять вредоносные SQL-команды, вставляя SQL-команды в веб-форму для отправки или ввода строки запроса доменного имени или запроса страницы.

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

В следующем примере введенное имя пользователя должно быть комбинацией букв, цифр и символов подчеркивания, а имя пользователя должно содержать от 8 до 20 символов:

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysqli_query($conn, "SELECT * FROM users 
                          WHERE username=$matches[0]");
}
 else 
{
   echo "username 输入异常";
}

Давайте посмотрим на ситуацию SQL, которая возникает, когда не фильтруются специальные символы:

// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

В приведенном выше операторе инъекции мы не фильтровали переменную $name, а ненужный нам оператор SQL был вставлен в $name, что удалит все данные в таблице пользователей.

mysqli_query() в PHP не позволяет выполнять несколько операторов SQL, но в SQLite и PostgreSQL несколько операторов SQL могут выполняться одновременно, поэтому нам необходимо строго проверять данные этих пользователей.

Чтобы предотвратить SQL-инъекцию, нам нужно обратить внимание на следующие моменты:

  • 1. Никогда не доверяйте пользовательскому вводу.Проверьте ввод пользователя, вы можете использовать регулярные выражения или ограничить длину; преобразовать одинарные кавычки и двойные «-» и т. д.
  • 2. Никогда не используйте динамическую сборку sql, вы можете использовать параметризованный sql или напрямую использовать хранимые процедуры для запроса данных и доступа.
  • 3. Никогда не используйте подключения к базе данных с правами администратора, используйте отдельные подключения к базе данных с ограниченными правами для каждого приложения.
  • 4. Не храните конфиденциальную информацию напрямую, не шифруйте и не хэшируйте пароли и конфиденциальную информацию.
  • 5. Информация об исключении приложения должна давать как можно меньше подсказок, и лучше всего использовать пользовательскую информацию об ошибке, чтобы обернуть исходную информацию об ошибке.
  • 6. Метод обнаружения SQL-инъекций обычно использует вспомогательные软件Или платформа веб-сайта для обнаружения, программное обеспечение обычно использует инструмент обнаружения sql-инъекций jsky, а платформа веб-сайта имеет инструмент обнаружения платформы безопасности веб-сайта Yisi. MDCSOFT SCAN и др.Использование MDCSOFT-IPS позволяет эффективно защищаться от SQL-инъекций, XSS-атак и т. д.

Предотвратить SQL-инъекцию

В языках сценариев, таких как Perl и PHP, вы можете экранировать данные, введенные пользователем, чтобы предотвратить внедрение SQL.

Расширение MySQL для PHP предоставляет функцию mysqli_real_escape_string() для экранирования специальных входных символов.

if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Внедрение в подобные заявления

При запросе типа, если пользователь вводит значения с «_» и «%», произойдет следующее: изначально пользователь хотел запросить «abcd_», но результаты запроса включают «abcd_», «abcde» и «abcdf " и т. д.; проблема также возникает, когда пользователь хочет запросить "30%" (примечание: тридцать процентов).

В сценарии PHP мы можем использовать функцию addcslashes() для обработки описанной выше ситуации, как в следующем примере:

$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_
 mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

Функция addcslashes() добавляет обратную косую черту перед указанным символом.

Формат синтаксиса:

addcslashes(string,characters)
参数描述
stringНеобходимый.Указывает строку для проверки.
символыПо желанию.Определяет символ или диапазон символов, на который влияет addcslashes().

Блог Хоуп Чен Вейлян ( https://www.chenweiliang.com/ ) поделился «Как MySQL предотвращает внедрение sql? принцип инъекции sql и предотвращение», это поможет вам.

Добро пожаловать, чтобы поделиться ссылкой на эту статью:https://www.chenweiliang.com/cwl-500.html

Добро пожаловать на Telegram-канал блога Chen Weiliang, чтобы быть в курсе последних обновлений!

🔔 Будьте первым, кто получит ценное «Руководство по использованию инструмента искусственного интеллекта для контент-маркетинга ChatGPT» в верхнем каталоге канала! 🌟
📚 Это руководство содержит огромную ценность. 🌟Это редкая возможность, не упустите ее! ⏰⌛💨
Делитесь и ставьте лайк, если хотите!
Ваш обмен и лайки - наша постоянная мотивация!

 

发表 评论

Ваш электронный адрес не будет опубликован. 必填 项 已 用 * 标注

滚动 到 顶部