C#字符串和sql注入

时间:2013-11-11 10:07:34

标签: sql entity-framework sql-injection

我想保护数据库免受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注入,但该字符串包含不需要的单词 - selectopenchar。因此,防止SQL注入的唯一方法是在不需要的单词周围添加引号?

1 个答案:

答案 0 :(得分:4)

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

参数化查询是一种查询,其中所有外部值都被(强类型)参数替换。参数值是带外传递的,因此无法进行SQL注入。

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

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

因此,原始文章对注射攻击持开放态度,而EF是安全的。