Mysql изменить разделитель для лучшей обработки SQL-инъекций? - PullRequest
1 голос
/ 29 августа 2009

Я использую mysql и пытаюсь заблокировать внедрение нежелательных запросов людей, которые попытаются использовать мой единственный запрос для запуска нескольких. например, когда у меня есть параметр «? id = 3», люди могут попытаться запустить его с = «id = 3; удалить таблицу пользователей»

Теперь я знаю, что лучший способ избежать этого - анализировать и проверять параметр, но есть ли способ изменить разделитель составных запросов с ";" на что-то вроде "% ^ # $% @ # $ ^ $"?

Ответы [ 4 ]

6 голосов
/ 29 августа 2009

Безопасность через неизвестность бесполезна. Потратьте время на написание правильного кода для защиты от атак SQL-инъекций. Выполнение этого заранее обойдется вам намного дешевле, чем после успешной атаки на ваш код!

4 голосов
/ 29 августа 2009

Лучший способ защиты от атак с использованием инъекций - использовать Подготовленные заявления .

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

3 голосов
/ 29 августа 2009

Конфигурация оператора DELIMITER является встроенной командой только в клиентском инструменте mysql. Вы не можете изменить разделитель для мульти-операторов . Это всегда точка с запятой.

Кроме того, MySQL API позволяет выполнять только один оператор за раз, по умолчанию. Пример, о котором вы говорите, не сработает, если вы явно не включите , включив несколько операторов .

Более того, мульти-операторы - не единственный вектор для внедрения SQL. Даже если бы вы могли изменить разделитель операторов, он ничего не сделал бы для защиты от внедрения SQL, который изменяет один данный оператор.

UPDATE Accounts SET PASSWORD = '...' WHERE account_id = $id

В этом примере, если $id имеет значение "1234 OR 1=1", злоумышленник изменил пароль для всех учетных записей, включая, вероятно, привилегированного пользователя. И все же никаких мульти-заявлений не было.

Вам по-прежнему нужно помнить о проблемах безопасности при написании кода. Нет серебряной пули для защиты от SQL-инъекций.

Даже параметры запроса не являются панацеей для внедрения SQL. Параметры заменяют только значения в выражениях SQL. Есть много распространенных случаев, когда все еще необходимо интерполировать переменные приложения в строку SQL. Например, при параметризации предиката IN() или при выборе выражений ORDER BY. Не слушайте людей, которые говорят, что подготовленные запросы на 100% защищены от недостатков безопасности.

См. Также мою презентацию Мифы и ошибки SQL-инъекций или главу по SQL-инъекциям в моей книге Антипаттерны SQL: предотвращение ошибок при программировании баз данных .

2 голосов
/ 29 августа 2009

Когда вы вызываете mysql_query или mysql_real_query, в любом случае он не будет запускать несколько операторов, поэтому разделитель операторов на самом деле не имеет значения. Вы можете включить несколько операторов для запроса при подключении , но, поскольку вы пытаетесь избежать этой возможности, просто не включайте ее.

Еще лучшим вариантом для предотвращения внедрения SQL является использование подготовленных операторов . Начните с mysql_stmt_init и mysql_stmt_prepare с заполнителями для параметров вашего оператора, а затем заполните параметры с mysql_stmt_bind_param до mysql_stmt_execute. Если вы не вызываете API напрямую, то любая имеющаяся у вас библиотека-обертка также должна обеспечивать поддержку подготовленных операторов. (Если он не поддерживает их, подумайте о переходе на лучшую оболочку.)

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