我知道这是一个简单的问题,但在我读过的所有内容中,我从来没有见过这个具体的拼写.
如果您在页面上进行查询,是否需要担心SQL注入攻击?或者,当您要求用户输入时,这只是一个问题吗?
谢谢!
您不必让用户输入遭受SQL注入攻击.
假设您有一个使用以下URL调用的产品页面:
product.aspx?ID=123
在您的代码中,您有一个构造如下的查询:
string sql = "SELECT * FROM Products WHERE ID = " + Request.Querystring["ID"];
有人可以使用此网址调用您的网页:
product.aspx?ID=123;DROP Table Students;
而且,你刚刚过去了.
除了可以通过用户,查询字符串,帖子,cookie,浏览器变量等传递的ANYTHING之外,我认为总是使用参数也是一种好习惯,即使你的代码中有文字也是如此.例如:
if(SomeCondition) { sql = "Select * from myTable where someCol = 'foo'"; } else { sql = "Select * from myTable where someCol = 'bar'"; }
这可能是注入安全的,但您的RDBMS会将它们缓存为两个不同的查询.如果你把它改为:
sql = "Select * from myTable where someCol = @myParam"; if(SomeCondition) { myCommand.Parameters.Add("@myParam").value = "foo"; } else { myCommand.Parameters.Add("@myParam").value = "bar"; }
您可以获得相同的结果,但RDBMS只会将其作为一个查询进行缓存,并在运行时替换该参数.我使用它作为经验法则总是使用参数化查询,只是为了保持一致,更不用说略微缓存改进了.