回答

收藏

参数真的足以阻止Sql注入吗?

技术问答 技术问答 146 人阅读 | 0 人回复 | 2023-09-13

我一直在向同事和SO讲这两种方法,以讲究在SQL查询(尤其是.NET应用程序)中使用参数的好处。我什至甚至承诺它们可以抵抗SQL注入攻击。" }9 b: e2 R- t6 V; g3 L" g
但是我开始怀疑这是否真的是真的。是否存在可以对参数化查询成功进行的已知SQL注入攻击?例如,您是否可以发送导致服务器上的缓冲区溢出的字符串?
9 U0 k3 t. [) b5 ?当然,要确保Web应用程序是安全的,还需要考虑其他因素(例如清理用户输入和所有其他内容),但是现在我正在考虑SQL注入。我对MsSQL
# Y/ g; B* @( D1 T5 W* G2005和2008的攻击特别感兴趣,因为它们是我的主要数据库,但是所有数据库都很有趣。' s& n- ~+ I4 y0 X# p0 E9 s. r
编辑:澄清我的意思是参数和参数化的查询。通过使用参数,我的意思是使用“变量”而不是在字符串中构建sql查询。
- J$ u! l% n- _! A3 Y! ?9 `因此,不要这样做:
5 P1 Z* L1 h' h+ WSELECT * FROM Table WHERE Name = 'a name'# p) ?( l, `# F- V3 z# g7 p
我们这样做:3 |  q! S5 J/ H' n1 L& V2 W# H
SELECT * FROM Table WHERE Name = @Name
& F/ _% M; S) G$ G' w# X然后在查询/命令对象上设置@Name参数的值。  L: f+ T4 K; W. I2 T0 F
               
' l6 Z  Z1 f) g, ~% l解决方案:, e9 g4 }! Q; q7 Y
               
0 i' h, `# ^. A- y+ \
7 a* D1 y; g" }# r
0 t+ }6 K  s; K6 l" R                占位符% H8 }: O9 k8 R% }4 s5 A6 K4 j
足以防止注入。您可能仍然对缓冲区溢出持开放态度,但这是与SQL注入完全不同的攻击方式(攻击向量不是SQL语法,而是二进制)。由于传递的所有参数都将被正确地转义,因此攻击者无法以任何方式传递将被视为“实时”
7 h1 w7 j; m6 p8 E$ OSQL的数据。
8 w/ c1 D2 `: M1 t  R/ i您不能在占位符内使用函数,也不能将占位符用作列名或表名,因为它们被转义并用字符串文字形式引用。5 J$ n/ H, L" h$ N
但是,如果您在动态查询中将 参数 用作 字符串连接的
/ b0 S8 V4 b7 i1 m. u- @( e4 x一部分,则您仍然容易受到注入的影响,因为您的字符串不会被转义,而是文字形式的。使用其他类型的参数(例如整数)是安全的。8 ^* V* u/ l9 K( ?3 ]
就是说,如果您使用use输入来设置诸如的值security_level,那么某人可以使自己成为系统中的管理员,并拥有免费的服务。但这只是基本的输入验证,与SQL注入无关。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则