gpt4 book ai didi

.net - 证明 SQL 注入(inject)

转载 作者:行者123 更新时间:2023-12-04 13:29:53 24 4
gpt4 key购买 nike

我试图在这里简单地证明这个简单的功能不足以阻止世界上的每一次 sql 注入(inject):

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,它毫无意义,我知道)
桌面上有某些触发器可以防止像这样的大规模更新,如果注入(inject)确实有效,则会引发一些错误。

PS。我知道参数化查询是要走的路,我不是在寻找像“我不知道为什么它不起作用,但参数化查询是要走的路”这样的答案。我正在寻找能够证明我们的软件已损坏并且我们需要使用更好的原则重写它的能力。

对于阅读此问题以了解如何更好地过滤文本字段的任何人,答案是不要!使用参数!它们更好、更安全、更容易!

最佳答案

Chr(8) 是引用的文字字符串的一部分,更新语句也是如此,因此 SQL Server 不会将其解释为函数调用。在此示例中,Text1 将设置为文字值:

'Chr(8); update tblMaint SET Value1 = 2 WHERE ValueID = 2--

(是的,包括那个单引号)

因此,通过此示例,您的代码是安全的。大多数对 SQL 注入(inject)的困扰是关于意外未能验证和引用值,在正确引用的 SQL 语句中没有任何固有的不安全性。

关于.net - 证明 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1834396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com