Существуют ли различия между SQL Server и MySQL, когда речь идет о предотвращении внедрения SQL? - PullRequest
13 голосов
/ 09 апреля 2010

Я привык к разработке на 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 ]

15 голосов
/ 09 апреля 2010

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

10 голосов
/ 09 апреля 2010

Используйте параметризованные запросы с ADODB или PDO . Эти библиотеки знают лучшую функцию escape на основе базы данных, к которой она подключена. Они позволяют переключаться между mysql и ms-sql без внесения уязвимостей.

Инъекции SQL для MySQL и MS-SQL радикально отличаются.

SQL-инъекция для MS-SQL намного более серьезна. Для одного вы можете составлять запросы:

select * from `table` where id='1' ; drop table `table`;-- '

Экранирование совершенно другое, addlashses () не не останавливает внедрение SQL под MS-SQL. Он использует систему двойных кавычек, поэтому это экранированный запрос:

select * from table where test='trying to inject '' didn''t work!'

Хакер также может получить доступ к cmd.exe, используя xp_cmdshell из запроса sql. Убедитесь, что эта привилегия была удалена!

В MySQL вы не можете составлять стеки, поэтому обычно используется объединение select (работает только при внедрении в select, в противном случае вы можете использовать sub-select, но не можете сложить drop / обновить / удалить / вставить поверх выбора):

select somthing from table where 1 union select password from mysql.user

Экранирование выполняется с помощью обратной косой черты, addlashes () работает большую часть времени, но 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"-- '
2 голосов
/ 09 апреля 2010

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

2 голосов
/ 09 апреля 2010

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

1 голос
/ 10 апреля 2010

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

1 голос
/ 09 апреля 2010

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

0 голосов
/ 10 апреля 2010

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

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

0 голосов
/ 09 апреля 2010

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

0 голосов
/ 09 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...