Есть ли какие-либо различия между SQL Server и MySQL когда дело доходит до предотвращения Внедрения SQL?

Я привык разрабатывать в PHP/MySQL, и не имейте никакого опыта при разработке с SQL Server. Я скользил по документации PHP MSSQL, и это выглядит подобным MySQLi в некоторых методах, о которых я читал.

Например, с MySQL я использую функцию mysql_real_excape_string (). Существует ли подобная функция с Сервером PHP/SQL?

Какие шаги я должен сделать для защиты от Внедрения SQL с SQL Server?

Каковы различия между SQL Server и MySQL, имеющим отношение к предотвращению Внедрения SQL?


также - действительно ли это сообщение точно? является символ строки Escape для SQL Server одинарной кавычкой?

13
задан rook 10 September 2010 в 18:08
поделиться

9 ответов

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

15
ответ дан 1 December 2019 в 20:30
поделиться

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

0
ответ дан 1 December 2019 в 20:30
поделиться

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

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

0
ответ дан 1 December 2019 в 20:30
поделиться

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

1
ответ дан 1 December 2019 в 20:30
поделиться

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

1
ответ дан 1 December 2019 в 20:30
поделиться

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

2
ответ дан 1 December 2019 в 20:30
поделиться

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

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

-1
ответ дан 1 December 2019 в 20:30
поделиться

Используйте параметризованные запросы с 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"-- '
10
ответ дан 1 December 2019 в 20:30
поделиться

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

2
ответ дан 1 December 2019 в 20:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: