我已经很好地掌握了 SQL 注入(inject)。当一个 SQL 查询应该是这样的时候
SELECT FirstName, LastName
FROM Customers
WHERE CustomerId = @valueFromApplication
变成了这样的查询
SELECT FirstName, LastName
FROM Customers
WHERE CustomerId = '' ; DROP DATABASE Foo --
当用户向您的应用程序、网站、客户端等中插入恶意值时。我还知道,攻击者不仅可以删除数据库,还可以尝试发现表的名称并从中获取信息。
我还知道一些有助于防止这种情况发生的事情是:
- 使用带参数的存储过程 (SQL Server)
- 使用参数化 SQL 查询
- 使用 Entity Framework /LINQ to Entities(C#,也许是 F#?)
这些东西如何真正防止 SQL 注入(inject)的发生?为什么攻击者不能将相同的恶意值传递到他或她已经使用的任何输入并获得相同的结果。
最佳答案
您的第一个示例是参数化的,不易受到 SQL 注入(inject)攻击。
参数化查询并非简单地由服务器替换为值(就像您可能手动将 @var
替换为 value
一样)。它们的发送和接收与您发送的完全一样。使用 @valueFromApplication
。
服务器将解析查询.. 当它到达一个变量时,它将查找提供的值。如果该值为 '' ; DROP DATABASE Foo --
.. 然后它成为它使用的值。它不解析...它只是将其用作文本/数字/任何类型。
补充一下 Entity Framework ,它在内部使用参数化查询,因此它也是 SQL 注入(inject)安全的。
关于c# - 为什么使用参数化查询或 Entity Framework 可以防止 sql 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23256298/