使原始 SQL 在 Entity Framework 中安全
Making raw SQL safe in Entity Framework
var retval = db.TestTable.SqlQuery("SELECT * FROM dbo.TestTable WHERE " + aColumn + " = '" + passedInValue + "'");
// normally when using parameters I would do something like this:
var valueParam = SqlParameter("aValue", passedInValues);
var retval = db.TestTable.SqlQuery("SELECT * FROM dbo.TestTable WHERE Column1 = @aValue", valueParam);
// NOTE: I would not do this at all. I know to use LINQ. But for this question, I'm concentrating on the issue of passing variables to a raw sql string.
但由于列和值都是 "parameters" in:
var retval = db.TestTable.SqlQuery("SELECT * FROM dbo.TestTable WHERE " + aColumn + " = '" + passedInValue + "'");
,是否可以防止两者的 sql 注入?
首先:whilelist aColumn
:这必须通过字符串连接添加,但您知道数据库中有哪些列(或者您可以使用架构视图进行检查)。
其次:在entity framework中——正如你所展示的——你可以在查询中使用参数作为值。但是,您可以传递值并使用 @p0
、@p1
、….
而不是创建 SqlParameter
实例
防止SQL注入的正确方法是使用SqlParameter
和SqlQuery<T>
:
var parameter = new SqlParameter("@title", value);
var result = context.Database.SqlQuery<Book>("SELECT * FROM Books WHERE Title LIKE @title", parameter);
http://ignoringthevoices.blogspot.ru/2013/07/sql-injection-with-entity-framework-5.html
var retval = db.TestTable.SqlQuery("SELECT * FROM dbo.TestTable WHERE " + aColumn + " = '" + passedInValue + "'");
// normally when using parameters I would do something like this:
var valueParam = SqlParameter("aValue", passedInValues);
var retval = db.TestTable.SqlQuery("SELECT * FROM dbo.TestTable WHERE Column1 = @aValue", valueParam);
// NOTE: I would not do this at all. I know to use LINQ. But for this question, I'm concentrating on the issue of passing variables to a raw sql string.
但由于列和值都是 "parameters" in:
var retval = db.TestTable.SqlQuery("SELECT * FROM dbo.TestTable WHERE " + aColumn + " = '" + passedInValue + "'");
,是否可以防止两者的 sql 注入?
首先:whilelist aColumn
:这必须通过字符串连接添加,但您知道数据库中有哪些列(或者您可以使用架构视图进行检查)。
其次:在entity framework中——正如你所展示的——你可以在查询中使用参数作为值。但是,您可以传递值并使用 @p0
、@p1
、….
SqlParameter
实例
防止SQL注入的正确方法是使用SqlParameter
和SqlQuery<T>
:
var parameter = new SqlParameter("@title", value);
var result = context.Database.SqlQuery<Book>("SELECT * FROM Books WHERE Title LIKE @title", parameter);
http://ignoringthevoices.blogspot.ru/2013/07/sql-injection-with-entity-framework-5.html