【发布时间】:2017-05-29 08:28:18
【问题描述】:
在我的项目中,我用下面的示例代码定义了一个存储过程:
CREATE PROCEDURE [dbo].[Stored]
@ParameterA AS varchar(128),
@ParameterB AS varchar(128),
@ParameterC AS varchar(400)
AS
BEGIN
DECLARE @query AS Varchar(MAX)
SET @query = 'SELECT *
FROM Table
WHERE A = '''+ @ParameterA + ''
IF @ParameterB = 'B'
BEGIN
SET @query = @query + ' AND C=''' + @ParameterC + ''
END
EXECUTE sp_executesql @query
END
我通过以下代码使用实体框架调用此过程:
DBContext.Database.SqlQuery<Object>("Stored",
new SqlParameter("@p0", Param0),
new SqlParameter("@p1", Param1),
new SqlParameter("@p2", Param2)).ToList();
如果我用下面的字符串调用存储过程,我会生成一个 SQL 注入:
Param2 = "ABC' ; DROP TABLE Table2"
如何使用 Entity Framework 防止这种情况发生?
【问题讨论】:
-
我建议您避免在 SQL 语句中使用所有形式的字符串连接,即使在存储过程中也是如此。此外,您可以通过过滤单词来清理输入,以便在执行查询之前在 EF 端删除这些 SQL 关键字。
-
可能是related
-
我认为你不能用 EF 本身阻止这种事情。我会考虑看大局msdn.microsoft.com/en-us/library/cc716760(v=vs.110).aspx
-
为什么要使用这样的存储过程而不是让 EF 生成安全查询?如果
Table映射到一个实体,为什么不编写一个EF 查询来返回它,必要时使用不同的Where()子句? -
@Marco 你想做什么?为什么不在 LINQ 中写一个简单的
context.Entities.Where(condition1)或context.Entities.Where(condition2)?如果您想动态添加多个条件,甚至var query=context.Entities.Where(condition1);query=query.Where(condition2)?
标签: c# sql-server asp.net-mvc entity-framework sql-injection