Существуют ли какие-либо различия между 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 одинарной кавычкой?

Author: rook, 2010-04-09

9 answers

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

 15
Author: Arkh, 2010-10-19 19:10:23

Используйте параметризованные запросы с 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"-- '
 10
Author: rook, 2010-04-10 00:10:44

Это не инструмент , который позволяет атаковать с помощью SQL-инъекций, это программист и то, как они его используют. как mysql, так и sql server позволяют вводить данные, если вы неправильно кодируете (слепо объединяете строки для создания динамического sql), и оба обеспечивают привязку параметров, чтобы избежать этого.

 2
Author: KM., 2010-04-09 15:49:16

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

 2
Author: Thomas, 2010-04-09 15:52:08

Нет, MSSQL не предоставляет такой функции, и в Mysqli вы также не должны использовать строку mysql_real_escape_string. В обоих случаях вы должны использовать Подготовленные инструкции или хранимые процедуры . Я полагаю, что документация PHP содержит исчерпывающее объяснение того, как использовать API MSSQL.

 1
Author: Billy ONeal, 2010-04-09 15:48:11

Параметризованные запросы - это правильный путь. Драйвер sqlsrv поддерживает параметризованные запросы. Конечно, это будет полезно вам только в том случае, если вы используете PHP в Windows. На случай, если это так, здесь есть дополнительная информация (с примерами): Как и почему использовать параметризованные запросы.

 1
Author: Brian Swan, 2010-04-09 22:56:49

С MSSQL вы можете использовать хранимые процедуры для снижения риска внедрения sql. Хранимые процедуры будут принимать входные данные различных типов, поэтому будет сложно передать строку с помощью команд sql.

Также проверьте http://msdn.microsoft.com/en-us/library/ms161953.aspx

 0
Author: Nertim, 2010-04-09 15:41:39

Любая база данных может быть подвержена атакам с использованием SQL-инъекций. Один из способов избежать их - использовать хранимые процедуры. Как MSSQL, так и MYSQL поддерживают хранимые процедуры.

 0
Author: codingguy3000, 2010-04-09 15:44:07

Хранимые процедуры. Вот и все. Запретить доступ к любой другой операции, кроме выполнения хранимых процедур. Таким образом, вы разрешаете отправлять в вашу базу данных только определенный набор запросов, тем самым устраняя любую форму внедрения SQL.

Оба поддерживают хранимые процедуры, НО в MSSQL их легче отлаживать, потому что сообщения об ошибках намного понятнее.

 -1
Author: AlexanderMP, 2010-04-09 21:16:47