关于vb.net:SQL注入:为什么以下代码很危险?

SQL Injection: Why is the following code dangerous?

一名实习生已编写以下vb.net代码:

1
2
3
4
5
6
7
8
9
10
11
12
    Public Sub PopulateUsersByName (name As String)
        'Here, the parameter 'name' is unsantized, coming straight from the form

        Dim query As String =""
        query += vbNewLine +" SELECT Id, FirstName, LastName FROM dbo.[Users]"
        query += vbNewLine +" WHERE FirstName LIKE '" + REPLACE(name,"'","''") +"'"
        query += vbNewLine +"     OR LastName LIKE '" + REPLACE(name,"'","''") +"'"

        'Execute SQLCommand with above query and no parameters
        'Then do some other stuff

    END Sub

我已经解释了,通常,在尝试执行上述操作时,永远不要使用字符串连接。最佳做法是使用SP或带参数的SQLClient.SQLCommand。

他的逻辑是:通过将所有单引号替换为两个单引号(并在字符串的开头和结尾添加其他单引号)来清理任何sql varchar(xxx)。

我无法提供一个示例,说明用户可以键入以解决此问题的方法-我希望我能找到比"但但是,作为一般负责人,应该避免这种情况-知道的,因为……"更令人信服的事情。好吧,别跟我争论-我是老板,我的愿望就是你的命令。"

注意:该代码将始终连接到我们的Microsoft SQL Server。但是我可以想象它未能清理其他一些SQL实现上的输入。

更新:

为了更清楚一点,我正在寻找的是参数name的可能值,该值将允许某人将SQL注入查询中。


尝试使用他的代码,使用'%_%'(带或不带单引号)作为输入。...与SQL中的用法相同。...

1
select SELECT Id, FirstName, LastName FROM dbo.[Users] from TBL_EMPLOYEES where FirstName like '%_%' or LastName like '%_%'

不管它是否失败,他的代码都是很糟糕的……很公平,这只是一个衬里,而除此之外,包括复杂的SQL语句将很难维护和调试。让他习惯使用它们,并允许他利用T-SQL的灵活性和强大功能...大声笑,我怕想想我编写的某些SQL在代码中的样子。

您知道,我一直都在遇到这样的代码(而且更糟糕)……只是因为它可能会工作一段时间,但这并不意味着这是正确的方法。……如果您的实习生没有这样做听经验,他永远不会成为一个好的开发者,可悲的是,这是事实

我曾经减少了一个初级开发人员尝试以与您的实习生相同的方式导入CSV文件(5,000万行)的尝试,从她的300行代码(这永远行不通)到仅一行LINQ即可将其转换为XML(我们不能使用Bulk Insert或bcp)和精美的SP。


消毒不是答案。您可以通过引号并使用"走私"。一个很好的例子是http://danuxx.blogspot.com.br/2011/08/sql-injection-bypassing-single-quotes.html

另外一个好的做法(使用动态查询)是使用参数动态查询。 SP也可以做到这一点(如果您当然不在其中使用动态查询)。


我可以得到所有用户的列表。如果name = %%

现在,我知道您数据库中每个人的全名。

我认为这是一个安全漏洞。