我需要将存储过程执行脚本存储在数据库表中。
举个例子:
exec proc_name 'somedata'
这些是在将要更改的数据经过审核过程后稍后执行的。
清理脚本以使该语句不能用于 sql 注入的最佳方法是什么。
是否有我可以使用的特定编码类型?还是像在'上进行替换一样简单
我需要将存储过程执行脚本存储在数据库表中。
举个例子:
exec proc_name 'somedata'
这些是在将要更改的数据经过审核过程后稍后执行的。
清理脚本以使该语句不能用于 sql 注入的最佳方法是什么。
是否有我可以使用的特定编码类型?还是像在'上进行替换一样简单
那么听起来你想使用一个 varchar(max) 列并有一个单独的参数表。如果你使用参数,你应该免受 SQL 注入的影响。请参阅下面的快速 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...
没有办法“清理”脚本。
保护代码的唯一方法是将代码与数据分开。并且只“清理”数据。
这就是我们将代码与数据分开的原因。
代码是可靠且安全的,数据是可变的,需要“清理”。
由于您违反了这条基本法则,将代码视为数据,因此无法保护它。
从任务的完全不寻常来看,我会说肯定有一个适当的解决方案。
你只是选择了错误的架构。
所以,你最好再问一个问题,比如“我想处理相当复杂的元数据结构(提供的结构和目的)”,你会得到一个合适的解决方案,不需要在数据中存储 SQL 代码。
您可以将脚本存储在存储过程或计划作业中以供以后执行。我看不出有任何理由对存储过程进行编码,因为您可以设置用户权限来防止不同的用户阅读甚至看到它们。