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)
我知道它不安全,因为谷歌搜索和查找StackOverflow.com上的其他问题. Here是我发现的一个问题,其中所有功能(例如我上面提到的功能)都是无关紧要和毫无意义的.
所以根据我链接的帖子,只需输入
‘Chr(8); update tblMaint SET Value1 = 2 WHERE ValueID = 2–
进入txtNote应该足以清除整个tblFilledForms表中text1中的每个值,然后将tblmaint表的第二行更新为2正确吗?
这里应该发生的是VB将其解释为
UPDATE tblFilledForms SET Text1 = ”’Chr(8); update tblMaint SET Value1 = 2 WHERE ValueID = 2–‘ WHERE FilledFormID = 5120327
并将其发送到sql,它将实习执行Chr(8)以擦除将产生的第三个’
UPDATE tblFilledForms SET Text1 = ”; update 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.我知道参数化查询是去这里的方式,我不是在寻找像“我不知道为什么它不起作用,但参数化查询是要走的路”的答案.我正在寻找能够证明我们的软件被破坏并且我们需要使用更好的原则重写它的能力.
对于读这个问题的人来说,如何更好地过滤你的文本字段,答案是不要!使用参数!它们更好,更安全,更容易!