-1

我想保护数据库免受 SQL 注入攻击,我注意到帖子http://www.dascode.net/post/2009/11/01/An-example-of-how-to-check-for-SQL -Injections.aspx很有用。

这是场景(我正在使用实体框架)

1) 用户想要添加例如“我想选择一本书,然后打开它并获取一个字符”之类的评论。

代码片段(示例):

string commVal = "lorem";

using(DB ctx = new DB())
{
   Comment c = new Comment { Value = commVal };
   ctx.Comment.Add(c);
   ctx.SaveChanges();
}

如您所见,这不是 SQL 注入,但该字符串包含不需要的单词 - select, open, char。那么,防止 SQL 注入的唯一方法是在不需要的单词周围添加引号?

4

1 回答 1

4

不,原始文章根本不起作用。避免 SQL 注入攻击的最简单和最便宜的方法是使用参数化查询,而 EF(以及几乎所有 ORM)就是这样做的。

参数化查询是所有外部值都被(强类型)参数替换的查询。参数值是带外传递的,因此不可能发生 SQL 注入。

使用参数化查询有多个额外的好处:

  • 您可以避免 ASCII、小数分隔符、日期格式的国际化错误,因为这些值是作为其原始类型传递的。
  • 网络流量减少了,因为本机表示总是小于它们的文本等价物。
  • 生成的查询会导致更快的系统性能,因为 SQL Server 只需在第一次发送参数化查询时对其进行解析。后续执行使用原始执行计划。

因此,原始文章对注入攻击敞开大门,而 EF 是安全的。

于 2013-11-11T10:12:22.063 回答