2013-02-25 2 views
-1

У меня есть такое заявление:инъекции SQL, если скобки и точка с запятой фильтруются

SELECT * FROM TABLE WHERE COLUMN = 123456 

123456 предоставляется пользователем поэтому она уязвима для SQLI, но если я раздеться все точкой с запятой и скобки, является возможным хакеру выполнять любые другие заявления (например, DROP,UPDATE,INSERT и т. д.), кроме SELECT?

Я уже использую подготовленные операторы, но мне любопытно, что если вход лишен терминатора строк и скобок, может ли хакер изменить БД каким-либо образом?

+3

Зачем нужно беспокоиться? Просто используйте подготовленные заявления или хранимые процедуры или какой-либо механизм, который предоставляет платформа. SQL-инъекция - это ** проблема **. Не делайте работу и стресс для себя. –

+0

В MSDN есть хорошая страница: http://msdn.microsoft.com/en-us/library/ms161953(v=sql.105).aspx – Deruijter

+1

Точки с запятой не требуются. Если они будут поставлять '123456 UPDATE FOO SET Bar = 12', это сработает. –

ответ

7

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

+1

Можете ли вы привести пример? – Elmo

1

В общем, очень сложно быть на 100% уверенным, что вы в безопасности от этого типа нападений, пытаясь лишить определенных персонажей - есть слишком много способов обойти ваш код (используя кодировки символов и т. Д.),

Лучшим вариантом является передача параметров хранимой процедуры, например:

CREATE PROCEDURE usp_MyStoredProcedure 
    @MyParam int 
AS 

BEGIN 
    SELECT * FROM TABLE WHERE COLUMN = @MyParam 

END 
GO 

Таким образом, SQL будет относиться значение, переданное в качестве параметра, и ничего больше, независимо от того, что она содержит. И в этом случае он будет принимать значение типа int в любом случае.

Если вы не хотите или не можете использовать хранимую процедуру, то я предлагаю изменить код, чтобы входной параметр мог содержать только предопределенный список символов - в этом случае числовые символы , Таким образом, вы можете быть уверены, что ценность безопасна в использовании.

+1

Вам не нужно использовать хранимые procs, вы можете использовать только параметризованные запросы. –

+0

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

Смежные вопросы