DBMS_ASSERT是防止Oracle中的SQL注入攻击的关键之一。我尝试过粗略的搜索...是否有与此功能等效的SQL Server 2005/2008?

我正在寻找一种与DBMS_ASSERT的所有相应Oracle软件包成员相对应的特定实现。


NOOP
SIMPLE_SQL_NAME
QUALIFIED_SQL_NAME
SCHEMA_NAME


我知道防止注入的最佳实践...绑定变量...是其中之一。
但是,在这个问题上,我特别想寻找一种清理输入的好方法……在不使用绑定变量的情况下。

您有任何具体的实现吗?
是否有一个实际上是Oracle软件包的SQL Server端口的库?

最佳答案

您唯一可能的选项是QUOTENAME,用于转义对象名称(因此可能等同于SIMPLE_SQL_NAMEENQUOTE_NAME以及其他名称。因此,表名(假设它们不具有所有者或数据库的资格)和列名可以转义。

没有完全限定对象的机制(例如,将表'bob'转换为'database.owner.bob'),因此您必须手动将其放在一起,可以选择使用QUOTENAME来转义值,例如:

QUOTENAME(@database) + '.' + QUOTENAME(@owner) + '.' + QUOTENAME(@tableName)

如果对象在现有数据库中,则可以使用DB_NAME(),并假定所有者将作为变量传递:

DB_NAME() + '.' + QUOTENAME(@owner) + '.' + QUOTENAME(@tablename)

以一种令人费解的方式,您还可以让所有者离开:

USER_NAME(OBJECTPROPERTY(OBJECT_ID(@tablename), 'ownerid')))

是的,我意识到所有这些都可以视为解决方法,但是它们是可选项。

但是,对于转义值,您实际上是自己一个人:没有内置的SQL Server等效项,因此所有手动字符串操作也将如此。您也许可以创建一个UDF来执行此操作,尽管如果要这样做,可能还值得一看的是使用SQL Server sp_ExecuteSQL语义重写存储过程。

10-07 12:34