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, чтобы быть в курсе последних обновлений!
📚 Это руководство содержит огромную ценность. 🌟Это редкая возможность, не упустите ее! ⏰⌛💨
Делитесь и ставьте лайк, если хотите!
Ваш обмен и лайки - наша постоянная мотивация!