SQL注入:为什么以下代码危险



实习生编写了以下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注入查询。

使用他的代码使用'%_%'(有和不带单引号)作为输入。

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 ...是子弹的证明,工作....

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

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

我会考虑一个安全孔。

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

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

最新更新