16

我遇到了需要使用 LINQ 的 ExecuteCommand 方法来运行插入的情况。

类似的东西(为了这个问题而简化):

object[] oParams = { Guid.NewGuid(), rec.WebMethodID };

TransLogDataContext.ExecuteCommand (
"INSERT INTO dbo.Transaction_Log (ID, WebMethodID) VALUES ({0}, {1})",
oParams);

问题是这是否与参数化查询一样是 SQL 注入证明?

4

2 回答 2

14

做了一些研究,我发现了这个:

在我的简单测试中,看起来在 ExecuteQuery 和 ExecuteCommand 方法中传递的参数是根据提供的值自动进行 SQL 编码的。所以如果你传入一个带有'字符的字符串,它会自动SQL将它转义为''。我相信类似的策略用于其他数据类型,如 DateTimes、Decimals 等。

http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx
(您可以向下滚动找到它)

这对我来说似乎有点奇怪——大多数其他 .Net 工具都比“SQL 转义”更清楚;他们使用真实的查询参数。

于 2008-10-01T14:38:59.327 回答
0

LINQ to SQL 使用带参数的exec_sql,这比连接到 ad-hoc 查询字符串要安全得多。它应该与使用 SqlCommand 及其 Paramaters 集合一样安全地对抗 SQL 注入(事实上,它可能是 LINQ to SQL 内部使用的)。话又说回来,这有多安全?

于 2008-10-01T21:08:22.400 回答