我一直在向我的同事们讲道,在这里谈论在SQL查询中使用参数的好处,特别是在.NET应用程序中.我甚至承诺给予他们免受SQL注入攻击的抵抗力.
但我开始怀疑这是否真的如此.是否有任何已知的SQL注入攻击可以成功对抗参数化查询?例如,您可以发送一个导致服务器缓冲区溢出的字符串吗?
当然还有其他考虑因素可以确保Web应用程序是安全的(比如清理用户输入和所有内容),但现在我正在考虑SQL注入.我对MsSQL 2005和2008的攻击特别感兴趣,因为它们是我的主要数据库,但所有数据库都很有趣.
编辑:澄清参数和参数化查询的含义.通过使用参数我的意思是使用"变量"而不是在字符串中构建SQL查询.
所以不要这样做:
SELECT * FROM Table WHERE Name = 'a name'
Run Code Online (Sandbox Code Playgroud)
我们这样做:
SELECT * FROM Table WHERE Name = @Name
Run Code Online (Sandbox Code Playgroud)
然后在查询/命令对象上设置@Name参数的值.
有没有一种优雅的方法来编写一个insert语句,它有很多参数?我有20个需要保存在DB中的标志,以及需要插入的其他信息以及这20个标志.为该插入编写一个包含30个参数的方法是浪费时间,但到目前为止,我还没有提出其他想法,这可能有用.
Martin Fowler在他的书"企业应用程序架构模式"中说
一个好的经验法则是避免字符串连接将SQL查询放在一起
我经常使用这种做法,从查询的真实data中抽象出我的SQL查询的语法.
你能解释一下为什么这被认为是一种不好的做法吗?
我只是想知道,如果我每更换'用''的用户输入,例如string.Replace("'","''"),和验证号码(确保它们是数字,不包含任何其他字符),是SQL注入仍然是可能的?怎么样?
我正在使用动态SQL查询SqlCommand.像这样的东西:
cmd.CommandText = "SELECT * FROM myTable WHERE ID = " + theID.ToString();
Run Code Online (Sandbox Code Playgroud)
要么
cmd.CommandText = "UPDATE myTable SET title='" + title.Replace("'","''") + "' WHERE ID = " + theID.ToString();
Run Code Online (Sandbox Code Playgroud)
在ASP.NET MVC中自动验证输入整数(检查它们是否是实数).