10

这些函数允许访问 SQL 中的特殊函数 (SqlClient)。例如“喜欢”或“之间”。它们还为它们提供了一个更好的通用抽象层。不要与另一个问题的主题存储过程“函数”相混淆。

我似乎无法找到完整答案的问题是。它们可以安全使用,还是我将系统打开到SQL 注入攻击?在编写常规 SqlCommands 时,我总是使用绑定变量。

但是在转向实体框架。对 SQL 语句的控制较少。我不介意,但是当我连接来自浏览器的字符串并将其传递给函数时,我不禁担心。

这是一个例子:

var QueryResult = EFContext.Table.Where(x => 
    SqlFunctions.PatIndex("%" + Potentially_unsafe_search_keyword + "%", 
                          x.Column) > 0);

我做了一些测试并跟踪了发送到服务器的实际 SQL。单引号会自动转义。所以很明显那里有一些保护。正在进行一些消毒。插入语句确实使用绑定变量。我应该满足于单引号替换吗?幕后还有其他事情发生吗?

4

1 回答 1

6

Linq 中的每个常量、变量、参数都作为 IDbCommand 中的命令参数传递,而这些参数又被底层驱动程序转义。

除非存在错误,否则所有 EF 查询和 SQL 帮助函数都可以安全地抵御 SQL 注入攻击。

于 2013-04-11T06:03:12.620 回答