我已经很好地掌握了 SQL 注入。当 SQL 查询应该是这样的时候
SELECT FirstName, LastName
FROM Customers
WHERE CustomerId = @valueFromApplication
变成这样的查询
SELECT FirstName, LastName
FROM Customers
WHERE CustomerId = '' ; DROP DATABASE Foo --
当用户将恶意值插入您的应用程序、网站、客户端等时......我还知道,攻击者不仅可以删除数据库,还可以尝试发现表的名称并从中获取信息。
我还知道一些有助于防止这种情况的事情是:
- 使用带参数的存储过程 (SQL Server)
- 使用参数化 SQL 查询
- 使用实体框架/LINQ to Entities(C#,也许 F#?)
这些东西实际上是如何防止 SQL 注入发生的呢?为什么攻击者不能将相同的恶意值传递到他或她已经使用的任何输入中并获得相同的结果。
您的第一个示例是参数化的,并且不易受到 SQL 注入的攻击。
参数化查询并不是简单地由服务器替换为值(就像您可能手动替换@var
with value
)。它们的发送和接收与您发送的完全一样..@valueFromApplication
.
服务器将解析查询......并且当它到达变量时,它将查找提供的值。如果该值为'' ; DROP DATABASE Foo --
..然后就变成了value它用。它不会解析它。它只是将其用作文本/数字/无论它是什么类型。
要添加实体框架,它内部使用参数化查询,因此它也是 SQL 注入安全的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)