回答

收藏

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

技术问答 技术问答 256 人阅读 | 0 人回复 | 2023-09-12

DBMS_ASSERT    是防止Oracle中的SQL注入攻击的关键之一。我尝试了一个粗略的搜索…该功能是否等效?SQL Server6 w- V. T4 C7 g2 G' P  B3 ^% u/ M
2005/2008?
& a; w$ [4 b2 K1 A6 M- X! j- ?, w我正在寻找一个具体的实现,应该实现DBMS_ASSERT的所有各个Oracle软件包成员的对等物。
0 v9 Q4 V5 W. X. y# q4 Z$ X: t! GNOOP & `, J0 C" [9 a) g" @. Y9 r
SIMPLE_SQL_NAME  Q$ |: I  V( h& [" E9 c3 U
QUALIFIED_SQL_NAME
" I& k8 {* _# E3 w1 K' QSCHEMA_NAME
我知道防止注入的最佳实践…绑定变量…其中之一。* x5 |2 u+ o) {8 ]+ ^
然而,在这个问题上,我特别想找到一种很好的方法来清理输入而不使用绑定变量。
$ k$ |5 |$ L( b; f  p. a' i你有什么具体的实现吗?" a5 I. t3 b4 k
其实有没有一个?Oracle软件包的SQL Server端口的库?( U0 }6 a6 [# i* s4 k, A" J
                                                               
3 }6 C6 R- e. I9 O$ y1 V, P    解决方案:                                                                  k8 S% l2 ~6 s2 |) D* l% |
                                                                你拥有的唯一可能的选项QUOTENAME用于转义对象名称(因此可能相当于)SIMPLE_SQL_NAME或ENQUOTE_NAME它可能相当于其他名称。因此,可以转换表名称(假设它们不具备所有者或数据库的资格)和列名称。
, b+ P+ e* L1 z1 A6 T对象资格没有完全限制的机制(例如,表 bob”变成“
8 j) _. K7 f( P, T2 t8 cdatabase.owner.bob所以你必须手动把它放在一起,也可以选择使用QUOTENAME例如:
- R- {0 B! {9 a, Z( B7 kQUOTENAME(@database)   '.'   QUOTENAME(@owner)   '.'   QUOTENAME(@tableName)( d2 B& s- m& _4 p9 i$ a
在现有数据库中使用对象DB_NAME假设所有者将作为变量传递:
7 X/ B' ~; ~: I( v: t5 ^DB_NAME()  .'   QUOTENAME(@owner)   '.'   QUOTENAME(@tablename)
+ ?' o7 v( z( A. K* c) N* [以一种真正令人费解的方式,你也可以拒绝所有者:; J& |- b1 u2 s$ z" A! q% ]3 j
USER_NAME(OBJECTPROPERTY(OBJECT_ID(@tablename),'ownerid')))4 w; _7 I) V. |6 Q/ n  l' `
是的,我意识到所有这些都可以作为解决方案,但它们是可选的。
8 p& M9 k& M2 o4 c" t# ~6 ?2 d但是,对于转义值,你其实是一个人:没有内置SQL- q% s1 z+ V$ ?8 O( K9 Z: O5 V
Server等效项,所以所有手动字符串操作都是如此。你可以创建一个UDF这个操作虽然要做,但可能值得一看。SQL Server) u4 T1 Y' E0 d7 V4 T* i) [1 o
sp_ExecuteSQL语义重写存储过程。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则