Oracle DBMS_ASSERT 的 Sql Server 等效项是什么?

Sha*_*10N 5 sql sql-server oracle sql-injection

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

我正在寻找一个特定的实现,它具有 DBMS_ASSERT 的所有相应 Oracle 包成员的对应项。

  • 诺普
  • SIMPLE_SQL_NAME
  • QUALIFIED_SQL_NAME
  • SCHEMA_NAME

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

有没有具体的实现方法?
是否有一个库实际上是 Oracle 包的 SQL Server 端口?

Chr*_*s J 1

您拥有的唯一可能的选项是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 语义重写存储过程。