SQL注入:为什么下面的代码很危险?

时间:2014-02-04 14:50:02

标签: vb.net tsql sql-injection sanitization

实习生编写了以下vb.net代码:

    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注入查询。

3 个答案:

答案 0 :(得分:1)

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

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

无论是否失败,他的代码都非常糟糕......公平地认为这只是一个单行,但是除此之外的任何内容,包括复杂的SQL语句都难以维护和调试..无论如何使用Sps让他习惯使用它们并允许他利用T-SQL的灵活性和强大功能...大声笑,我很想想我编写的一些SQL在代码中会是什么样子。 ...

你知道,我总是遇到这样的代码(而且情况要糟糕得多)......只是因为它可能会工作一段时间并不意味着它是正确的做法....如果你的实习生不听经验,他永远不会成为一个好的开发人员,这是一个可悲的事实

我曾经减少了一个初级开发人员尝试导入CSV文件(5000万行),就像你的实习生一样,从她的300行代码(从来没有工作)到只有一行LINQ到将它转换为XML(我们不能使用批量插入或bcp)和一个花哨的SP ...是防弹,工作完成....

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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