PostgreSQL的dollar-quoting机制是否足以抵御恶意输入规避SQL注入?
PostgreSQL的dollar quoting机制能否完全防范SQL注入?
示例场景结论
你给出的场景中,dollar quoting确实可以抵御当前的注入尝试:
示例SQL:
SELECT * FROM mytable WHERE title = $secret$ hack'-- $secret$
用户输入:hack'--
该场景下dollar quoting的字符串边界是$secret$,用户输入里的单引号不会被解析为字符串终止符,整段输入会被当做普通字符串处理,不会触发SQL注入。
无法完全规避所有SQL注入风险的场景
dollar quoting不是防范SQL注入的万能方案,满足以下任意条件时依然存在注入风险:
- dollar tag被用户可控或可预测时会被绕过
如果dollar标签(即两个$中间的自定义标识,示例中的secret)是固定值、可被攻击者猜到、甚至允许用户控制标签内容,攻击者就可以构造包含相同标签的输入闭合字符串,触发注入。比如攻击者知道你用$secret$作为标签,将输入构造为$secret$; DROP TABLE mytable;--,拼接后的SQL就会变成SELECT * FROM mytable WHERE title = $secret$$secret$; DROP TABLE mytable;-- $secret$,直接执行恶意删表语句。 - 仅适用于字符串常量场景,无法覆盖动态SQL的所有位置
dollar quoting只能用于包裹SQL中的字符串常量值,如果你需要动态拼接表名、列名、SQL关键字等非字符串内容,dollar quoting完全不生效,这类场景需要用专门的标识符转义(比如PostgreSQL的quote_ident函数)或者白名单校验来防范注入。 - 不能替代参数化查询作为终极防护方案
dollar quoting只是动态拼接字符串时的辅助安全手段,防护边界远不如预编译参数化查询可靠。只要条件允许,优先使用应用层的参数化查询,才是防范SQL注入的最优方案。
内容的提问来源于stack exchange,提问作者Noob Life
相关产品推荐
相关产品推荐

