-1

我需要将存储过程执行脚本存储在数据库表中。

举个例子:

exec proc_name 'somedata'

这些是在将要更改的数据经过审核过程后稍后执行的。

清理脚本以使该语句不能用于 sql 注入的最佳方法是什么。

是否有我可以使用的特定编码类型?还是像在'上进行替换一样简单

4

3 回答 3

1

那么听起来你想使用一个 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...
于 2012-04-05T02:00:39.980 回答
0

没有办法“清理”脚本。
保护代码的唯一方法是将代码与数据分开。并且只“清理”数据。

这就是我们将代码与数据分开的原因。
代码是可靠且安全的,数据是可变的,需要“清理”。

由于您违反了这条基本法则,将代码视为数据,因此无法保护它。

从任务的完全不寻常来看,我会说肯定有一个适当的解决方案。
你只是选择了错误的架构。
所以,你最好再问一个问题,比如“我想处理相当复杂的元数据结构(提供的结构和目的)”,你会得到一个合适的解决方案,不需要在数据中存储 SQL 代码。

于 2012-04-05T05:31:27.000 回答
0

您可以将脚本存储在存储过程或计划作业中以供以后执行。我看不出有任何理由对存储过程进行编码,因为您可以设置用户权限来防止不同的用户阅读甚至看到它们。

于 2012-04-05T01:54:19.997 回答