实习生编写了以下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注入查询。
答案 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也可以做到这一点(如果你当然不在其中使用动态查询)。