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()
"Loading entities from stored procedures" 部分 ?
补充问题2:
如何传递 Nullable 参数?
您展示的第一次尝试与参数化查询无关。它只是简单的串联查询,并且无法防御 sql 注入。
如果您真的关心 sql 注入,则必须使用您展示的第二种方法。
我必须遵循必须在 "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()"Loading entities from stored procedures" 部分 ?
补充问题2: 如何传递 Nullable 参数?
您展示的第一次尝试与参数化查询无关。它只是简单的串联查询,并且无法防御 sql 注入。
如果您真的关心 sql 注入,则必须使用您展示的第二种方法。