在数据库表中存储Sql脚本的最佳方法

时间:2012-04-05 01:52:24

标签: sql sql-server sql-injection

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

举个例子:

exec proc_name 'somedata'

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

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

我可以使用特定的编码类型吗?或者就像在'

上进行替换一样简单

3 个答案:

答案 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代码。