好的,所以我理解使用SqlParameters的重要性,这个问题可能看起来有点愚蠢,但我不能完全确定答案,并希望确保我做出正确的决定。
考虑这个简单的c#方法:
public static void MakeLinks (int tableOneId, List<int> tableTwoIds, string storedProcedureName)
{
using (SqlConnection conn = new SqlConnection(<connection string>))
{
// Code Omitted
using (SqlCommand cmd = new SqlCommand(storedProcedureName, conn)
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
// SqlParameterCollection code omitted
cmd.ExecuteNonQuery();
}
}
}
基本上,我有很多方法可以链接各种表组合中的行。在每一个中,“TableOne”有一个Id,“TableTwo”有一个ID集合。每个组合在数据库中都有一个相关的StoredProcedure,.NET代码非常重复。因此,我正在考虑使用上述方法,将所有StoredProcedure参数名称更新为相同(例如@Id而不是“@tableOneId”,“@ tableTwoId”等)然后只需将StoredProcedure的名称传递给方法,这样创建命令字符串:
string commandString = String.Format("[DatabaseName].[dbo].{0}", storedProcedureName);
因此,我的问题是,这仍然是安全的,还是有更好的方法来处理/执行此操作?
非常感谢您的想法和建议。
答案 0 :(得分:3)
更改存储过程参数的名称使其不再安全或不太安全。有人可能会认为,获得数据库访问权限的人可能会注意到这种模式 - 但是精明的人会意识到,如果攻击者能够访问您的数据库,那么无论如何你都会被搞砸。
如果你可以通过使参数名称具有通用性来使你的代码更易于重复使用 - 那就去吧,我说。它也是半文档,这些存储过程执行相同的种类的功能,我希望更多的存储过程,我有不幸遇到一些类型的命名可以依赖的惯例!
答案 1 :(得分:2)
使用一种方法运行类似的存储过程是否安全, 将StoredProcedure名称作为方法参数传递
是强>
看起来你有多个程序,类似的工作只是名称不同。通过将过程名称传递给C#方法,(如SQL注入)应该没有任何问题。