Существуют ли какие-либо различия между SQL Server и MySQL, когда речь заходит о предотвращении внедрения SQL?
Я привык разрабатывать на PHP/MySQL и не имею опыта разработки с SQL Server. Я просмотрел документацию PHP MSSQL, и она похожа на MySQLi в некоторых методах, о которых я читал.
Например, с MySQL я использую функцию mysql_real_excape_string(). Есть ли аналогичная функция с PHP/SQL Server?
Какие шаги мне нужно предпринять для защиты от внедрения SQL с помощью SQL Server?
Каковы различия между SQL Server и MySQL, относящиеся к предотвращению инъекций SQL?
Также - является ли это точным сообщением? является ли символ escape-строки для SQL Server одинарной кавычкой?
9 answers
Используйте PDO и параметризованные запросы , и каждый компонент базы данных выглядит почти одинаково.
Используйте параметризованные запросы с ADODB или PDO. Эти библиотеки знают наилучшую функцию escape для использования на основе базы данных, к которой она подключена. Они позволяют переключаться между mysql и ms-sql без внесения уязвимостей.
Внедрение SQL для MySQL и MS-SQL радикально отличаются.
Инъекция SQL для MS-SQL намного серьезнее. Для одного из них вы можете стекировать запросы:
select * from `table` where id='1' ; drop table `table`;-- '
Побег - это совершенно другое, addslashses()не останавливает внедрение sql в MS-SQL. Он использует систему двойных кавычек, так что это экранированный запрос:
select * from table where test='trying to inject '' didn''t work!'
Хакер также может получить доступ cmd.exe используя xp_cmdshell
из sql-запроса. Убедитесь, что эта привилегия была удалена!
В MySQL вы не можете складывать, поэтому обычно используется union select (работает только при вставке в select, в противном случае вы можете использовать подвыбор, но вы не можете складывать удаление/обновление/удаление/вставку поверх выбрать):
select somthing from table where 1 union select password from mysql.user
Экранирование выполняется с помощью обратных косых черт, addslashes() работает большую часть времени, но mysql_real_escape_string() намного лучше.
select * from table where test='trying to inject \' didn\'t work!'
Также вы хотите отключить file_priv, иначе хакер может удалить бэкдор:
select test from table where name='jon' union select "<?php eval($_GET[e])?>" into outfile "/var/www/backdoor.php"-- '
Это не инструмент , который позволяет атаковать с помощью SQL-инъекций, это программист и то, как они его используют. как mysql, так и sql server позволяют вводить данные, если вы неправильно кодируете (слепо объединяете строки для создания динамического sql), и оба обеспечивают привязку параметров, чтобы избежать этого.
Нет. Ни в одном продукте баз данных нет наследования, которое могло бы защитить вас от внедрения SQL, потому что проблема не коренится в базе данных. Проблема заключается в том, как внешние приложения формулируют запросы и отправляют их в базу данных.
Нет, MSSQL не предоставляет такой функции, и в Mysqli вы также не должны использовать строку mysql_real_escape_string. В обоих случаях вы должны использовать Подготовленные инструкции или хранимые процедуры . Я полагаю, что документация PHP содержит исчерпывающее объяснение того, как использовать API MSSQL.
Параметризованные запросы - это правильный путь. Драйвер sqlsrv поддерживает параметризованные запросы. Конечно, это будет полезно вам только в том случае, если вы используете PHP в Windows. На случай, если это так, здесь есть дополнительная информация (с примерами): Как и почему использовать параметризованные запросы.
С MSSQL вы можете использовать хранимые процедуры для снижения риска внедрения sql. Хранимые процедуры будут принимать входные данные различных типов, поэтому будет сложно передать строку с помощью команд sql.
Также проверьте http://msdn.microsoft.com/en-us/library/ms161953.aspx
Любая база данных может быть подвержена атакам с использованием SQL-инъекций. Один из способов избежать их - использовать хранимые процедуры. Как MSSQL, так и MYSQL поддерживают хранимые процедуры.
Хранимые процедуры. Вот и все. Запретить доступ к любой другой операции, кроме выполнения хранимых процедур. Таким образом, вы разрешаете отправлять в вашу базу данных только определенный набор запросов, тем самым устраняя любую форму внедрения SQL.
Оба поддерживают хранимые процедуры, НО в MSSQL их легче отлаживать, потому что сообщения об ошибках намного понятнее.