在postgresql中,可以使用“Dollar-Quoted String Constants”来避免在常量字符串中转义单引号:
没有Dollar-Quoted字符串常量:
'Jeff''s table'
使用Dollar-Quoted字符串常量:
$$Jeff's table$$
是否有MySQL等价物?
编辑:我不是在寻找一种清理输入的方法,我正在寻找一种方法来生成更容易阅读的查询。
答案 0 :(得分:1)
不,因为它不起作用。攻击者只是在他们的注射尝试中添加了一对美元符号。
处理此问题的正确方法是使用实际查询参数的系统,以便参数值永远不会直接替换为查询字符串。这通常对性能更好,因为db可以更好地缓存执行计划,而不是最终动态构建字符串,这在现代语言中往往很慢。
没有多余的连接语句也大大提高了代码的可读性。而不是:
sql = "SELECT * FROM MyTable WHERE Column1=$$" + somevarialbe + "$$ AND Column2=$$" + OtherVariable";
就是这样:
sql = "SELECT * FROM MyTable wHERE Column1=@Value1 AND Column2=@Value2";
嗯......好的,我现在可以看到这个功能的一些有限效用。
想象一下具有存储过程的票证跟踪系统,以获取打开的票证。实际上,您可能会将文本“open”硬编码到查询的where子句中。并不是说这是一个很好的设计 - 故障单状态应该在一个带有它自己的密钥的表中,这样你就可以对密钥进行硬编码而不是文本。但它为有效和更复杂的东西种下种子。
答案 1 :(得分:1)
您可以将字符串括在双引号中,例如
"Jeff's table"
注意:如果这不起作用,则表示您已启用ANSI_QUOTES
SQL模式。 MySQL docs说:
如果启用了
ANSI_QUOTES
SQL模式,则只能在单引号内引用字符串文字,因为双引号内引用的字符串被解释为标识符。