Я привык разрабатывать в PHP/MySQL, и не имейте никакого опыта при разработке с SQL Server. Я скользил по документации PHP MSSQL, и это выглядит подобным MySQLi в некоторых методах, о которых я читал.
Например, с MySQL я использую функцию mysql_real_excape_string (). Существует ли подобная функция с Сервером PHP/SQL?
Какие шаги я должен сделать для защиты от Внедрения SQL с SQL Server?
Каковы различия между SQL Server и MySQL, имеющим отношение к предотвращению Внедрения SQL?
также - действительно ли это сообщение точно? является символ строки Escape для SQL Server одинарной кавычкой?
Используйте PDO и параметризованные запросы , и все механизмы базы данных выглядят почти одинаково.
Любая база данных может быть подвержена атакам с использованием SQL-инъекций. Один из способов избежать их - использовать хранимые процедуры. И MSSQL, и MYSQL поддерживают хранимые процедуры.
С MSSQL вы можете использовать хранимые процедуры, чтобы снизить риск внедрения sql. Хранимые процедуры будут принимать ввод различных типов, поэтому было бы сложно передать строку с помощью команд sql.
также посетите http://msdn.microsoft.com/en-us/library/ms161953.aspx
Нет, MSSQL не предоставляет такой функции, и в Mysqli вам также не следует использовать mysql_real_escape_string. В обоих случаях следует использовать Подготовленные операторы или Сохраненные процедуры . Я считаю, что документация PHP дает подробное объяснение того, как использовать API MSSQL.
Параметризованные запросы - это то, что нужно. Драйвер sqlsrv поддерживает параметризованные запросы. Конечно, это будет полезно только в том случае, если вы используете PHP под Windows. Если же вы работаете, то больше информации (с примерами) можно найти здесь: Как и зачем использовать параметризованные запросы.
Это не инструмент , который позволяет атаковать SQL-инъекции, а программист и то, как они его используют. и mysql, и sql server позволяют вам получить инъекцию, если вы кодируете неправильно (слепое объединение строк для создания динамического sql), и оба обеспечивают привязку параметров, чтобы этого избежать.
Хранимые процедуры. Вот и все. Запретите доступ к любым другим операциям, кроме выполнения хранимых процедур. Таким образом, вы разрешаете только определенный набор запросов к вашей базе данных, что исключает любую форму SQL Injection.
Обе системы поддерживают хранимые процедуры, но в MSSQL их легче отлаживать, поскольку сообщения об ошибках гораздо понятнее.
Используйте параметризованные запросы с ADODB или PDO. Эти библиотеки знают, какую функцию escape лучше использовать в зависимости от базы данных, к которой они подключены. Они позволяют переключаться между mysql и ms-sql, не создавая уязвимостей.
SQL Injection для MySQL и MS-SQL радикально отличаются.
SQL Injection для 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, иначе можно использовать sub-select, но вы не можете стекировать drop/update/delete/insert поверх 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-инъекции, потому что проблема не коренится в базе данных. Проблема в том, как внешние приложения формулируют запросы и отправляют их в базу данных.