Доказательство SQL-инъекции

Я пытаюсь просто доказать здесь, что эта простая функция не достаточно хороша, чтобы предотвратить каждую инъекцию SQL в мире:

Function CleanForSQL(ByVal input As String) As String
    Return input.Replace("'", "''")
End Function

Вот типичное выражение вставки из одного из наших приложений:

Database.DBUpdate("UPDATE tblFilledForms SET Text1 = '" + CleanForSQL(txtNote.Text) + "' WHERE FilledFormID = " + DGVNotes.SelectedRows(0).Cells("FilledFormID").Value.ToString)

Я знаю, что это небезопасно из-за поиска в Google и поиска других вопросов на StackOverflow.com.Вот это один вопрос, который я нашел, в котором все функции, такие как та, которую я представил выше, не имеют отношения к делу и бессмысленны.

Поэтому, основываясь на сообщении, на которое я ссылаюсь, просто набираю

«Chr (8); обновить tblMaint SET Value1 = 2, где ValueID = 2--

в txtNote должно быть достаточно, чтобы очистить каждое значение в text1 во всей таблице tblFilledForms, а затем обновить вторую строку таблицы tblmaint, чтобы она была 2 правильной?

То, что ДОЛЖНО случиться здесь, - то, что VB интерпретирует это

ОБНОВЛЕНИЕ tblFilledForms SET Text1 = '' 'Chr (8); обновить tblMaint SET Value1 = 2 WHERE ValueID = 2-- 'WHERE FilledFormID = 5120327

и отправить его в SQL, который будет выполнять Chr (8), чтобы стереть третий ', который будет производить

ОБНОВЛЕНИЕ tblFilledForms SET Text1 = ''; обновить tblMaint SET Value1 = 2 WHERE ValueID = 2-- 'WHERE FilledFormID = 5120327

быть на самом деле выполняется в базе данных правильно?

Затем я скопировал Chr (8) из буфера обмена и заменил Chr (8) в текстовом поле содержимым буфера обмена и все еще не использовать. Он помещает всю строку прямо в поле без проблем.

Так что я тут делаю не так? или что еще я могу сделать, чтобы сломать его?

Технологии и опыт: я использую MS SQL Server 2005 и VB .NET 2005. Поле Text1 в базе данных - это поле Varchar (600) (не спрашивайте, почему оно не MAX, оно бессмысленно, я знаю) Есть определенные триггеры в таблице, которые предотвратят массовое обновление, такое как это, и вызовут некоторые ошибки, если внедрение действительно работает правильно.

PS. Я знаю, что здесь можно использовать параметризованные запросы, и я не ищу ответы типа «ну, я не знаю, почему это не работает, но параметризованные запросы - это путь». Я ищу возможность доказать, что наше программное обеспечение сломано и что нам нужно переписать его, используя лучшие принципы.

Любой, кто читает этот вопрос, чтобы выяснить, как лучше фильтровать текстовые поля, ответ - НЕ! Используйте параметры! они намного лучше, безопаснее и проще!

Ответы на вопрос(5)

Ваш ответ на вопрос