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_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语义重写存储过程。