c# - 为什么使用参数化查询或 Entity Framework 可以防止 sql 注入(inject)?

标签 c# sql entity-framework sql-injection prepared-statement

我已经很好地掌握了 SQL 注入(inject)。当一个 SQL 查询应该是这样的时候

SELECT FirstName, LastName 
FROM Customers 
WHERE CustomerId = @valueFromApplication

变成了这样的查询

SELECT FirstName, LastName 
FROM Customers 
WHERE CustomerId = '' ; DROP DATABASE Foo --

当用户向您的应用程序、网站、客户端等中插入恶意值时。我还知道,攻击者不仅可以删除数据库,还可以尝试发现表的名称并从中获取信息。

我还知道一些有助于防止这种情况发生的事情是:

  1. 使用带参数的存储过程 (SQL Server)
  2. 使用参数化 SQL 查询
  3. 使用 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/

相关文章:

mysql - 尝试恢复大于 10 GB 的 sql 转储文件

.net - Entity Framework POCO 模板丢失(我使用的是 Visual Studio 2010 Professional )

c# - 如何使用 Entity Framework ASP.Net MVC 5 删除多条记录?

c# - Azure AD (MSAL) 身份验证不适用于 ASP.NET 核心 API

c# - 如何在 PowerShell 中创建一个 Outlook 规则,将电子邮件无错误地移动到文件夹,使用在 C# 中完美运行的相同代码?

php - 使用 2 个表格获取结果

c# - 是否可以强制将所有 DateTime 属性建模为 DateTime2?

c# - 实体类型的 EF 条件包含

c# - 我应该使用单个 DataGrid、多个 DataGrid 还是完全不同的东西?

sql - 具有一对多关系和 orderby 复杂表达式的 Linq SQL 错误