String.Format 在 Database.SQLQuery 命令和 SQL 注入

String.Format in Database.SQLQuery command and SQL Injection

我必须遵循必须在 "parameterized way" 中执行存储过程的规则。我相信它是关于 SQL 注入保护的。 我想知道以下代码是否可以被视为 "parameterized execution" 并且是否受到 SQL 注入保护。

return Database.SqlQuery<Program>(
              String.Format("usp_GetPrograms {0},{1},{2},{3}", 
                              pID, pDisplayStart, pDisplayLength, pSearchString)
    ).ToList();

否则我可以将它改写成类似的东西

context.Database.SqlQuery<myEntityType>(
    "mySpName @param1, @param2, @param3",
    new SqlParameter("param1", param1),
    new SqlParameter("param2", param2),
    new SqlParameter("param3", param3)
);

我问是因为程序已经完成并经过测试并准备好投入生产,我不想重写代码并冒着出现问题的风险。

您如何看待这两种方法?

补充问题: 根据

是否需要 SqlParameter()

https://msdn.microsoft.com/en-US/data/jj592907

"Loading entities from stored procedures" 部分 ?

补充问题2: 如何传递 Nullable 参数?

您展示的第一次尝试与参数化查询无关。它只是简单的串联查询,并且无法防御 sql 注入。

如果您真的关心 sql 注入,则必须使用您展示的第二种方法。