sql - sql 注入(inject)攻击是否只是对具有表单的页面的威胁?

标签 sql security web-applications sql-injection

我知道这是一个简单的问题,但在我读过的所有内容中,我从未见过具体说明这一点。

如果在页面上做查询,是否需要担心 SQL 注入(inject)攻击?还是仅当您要求用户输入时才有问题?

谢谢!

最佳答案

您不必有用户输入即可遭受 SQL 注入(inject)攻击。

假设您有一个使用如下 URL 调用的产品页面:

product.aspx?ID=123

在您的代码中,您构建了一个查询,如下所示:
string sql = "SELECT * FROM Products WHERE ID = " + Request.Querystring["ID"];

有人可以使用此 url 调用您的页面:
product.aspx?ID=123;DROP Table Students;

和bam,你刚刚被拥有。

除了可以通过用户、查询字符串、帖子、cookie、浏览器变量等传递的任何内容之外。我认为始终使用参数只是一个好习惯,即使您的代码中有文字。例如:
if(SomeCondition)
{
    sql = "Select * from myTable where someCol = 'foo'";
}
else
{
    sql = "Select * from myTable where someCol = 'bar'";
}

这可能是注入(inject)安全的,但您的 RDBMS 会将它们缓存为两个不同的查询。
如果你修改它:
sql = "Select * from myTable where someCol = @myParam";
if(SomeCondition)
{
   myCommand.Parameters.Add("@myParam").value = "foo";
}
else
{
   myCommand.Parameters.Add("@myParam").value = "bar";
}

您获得了相同的结果,但 RDBMS 只会将其缓存为一个查询,在运行时替换参数。我使用它作为经验法则总是使用参数化查询,只是为了保持一致,更不用说轻微的缓存改进了。

关于sql - sql 注入(inject)攻击是否只是对具有表单的页面的威胁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1716979/

相关文章:

java - 从 Webapp 并行调用不同的 Web 服务

web-applications - 如何测试网站的低带宽?

Javascript单页应用导览工具

c# - Mysql如果存在则更新否则插入

sql - C# SqlParameter - 提供 SQL (Microsoft SQL)

java - 如何修复 Java Web 应用程序中通过发送数据泄露信息的缺陷

asp.net - 为什么我收到此错误 : System. Security.SecurityException:请求类型 'System.Web.AspNetHostingPermission, ...' 的权限失败

sql - 检查用户是否具有 CREATE DATABASE 权限

mysql - 看似简单的MYSQL查询

mysql - 多个主机名和多个权限?