实习生编写了以下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可以做到这一点(如果您不使用路线中的动态查询)。