我需要将存储过程执行脚本存储在数据库表中。
举个例子:
exec proc_name 'somedata'
这些是在将要更改的数据经过审核过程之后的稍后执行。
清理脚本的最佳方法是什么,以便该语句不能用于sql注入。
我可以使用特定的编码类型吗?或者就像在'
上进行替换一样简单答案 0 :(得分:1)
然后听起来你想要使用varchar(max)列并为参数设置一个单独的表。如果你使用参数,你应该安全地从SQL注入。请参阅下面的quickie C#示例:
C#伪代码示例
SQLCommand command = new SQLCommand("select * from myScripts where scriptid = @scriptid");
SQLParameter param = new SQLParameter("@scriptid", 12, int);
...new SQLCommand("select * from myParams where scriptid = @scriptid");
...new SQLParameter...
DataReader dr = new blah blah...
SQLCommand userCommand = new SQLCommand(dr['sql']);
foreach (parameter in params)
{
userCommand.Parameter.Add(parameter['name'], value);
}
userCommand.Execute...
答案 1 :(得分:0)
您可以存储脚本以便以后在存储过程或预定作业中执行。我没有看到编码存储过程的任何理由,因为您可以设置用户权限以防止不同的用户阅读甚至看到它们。
答案 2 :(得分:0)
没有办法“清理”脚本 保护代码的唯一方法是将代码与数据分开。并且仅“清理”数据。
这就是我们将代码与数据分开的原因 代码是可靠且安全的,数据是可变的,并且可以“清理”。
当你打破这个基本法则,将代码视为数据时,没有办法保护它。
从任务的完全不寻常的角度来看,我认为确实有一个合适的解决方案 你只需选择错误的架构 所以,你最好问另一个问题,比如“我想处理非常复杂的元数据结构(提供结构和目的)”,你将得到一个合适的解决方案,不需要在数据中存储SQL代码。