我很好地掌握了 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 注入发生的呢?为什么攻击者不能将相同的恶意值传递到他或她已经使用的任何输入中并获得相同的结果。