DBMS_ASSERT 是防止Oracle中的SQL注入攻击的关键之一。我尝试了一个粗略的搜索…是否有与此功能等效的SQL Server 2005/2008?
我正在寻找一种特定的实现,该实现具有DBMS_ASSERT的所有各个Oracle软件包成员的对等物。
我知道防止注入的最佳实践…绑定变量…是其中之一。 但是,在这个问题上,我特别想在不使用绑定变量的情况下寻找一种清理输入的好方法。
您有任何具体的实现吗? 是否有一个实际上是Oracle软件包的SQL Server端口的库?
您拥有的唯一可能的选项QUOTENAME是用于转义对象名称(因此可能等同于SIMPLE_SQL_NAME或ENQUOTE_NAME可能等同于其他名称。因此,可以转义表名称(假设它们不具有所有者或数据库的资格)和列名称。
QUOTENAME
SIMPLE_SQL_NAME
ENQUOTE_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语义重写存储过程。