在SQL中必须转义哪些正则表达式字符?

时间:2018-08-31 19:28:05

标签: sql regex escaping xss

为防止SQL注入攻击,《构建可扩展的网站》一书具有将正则表达式字符替换为转义版本的功能:

function db_escape_str_rlike($string) {
    preg_replace("/([().\[\]*^\$])/", '\\\$1', $string);
}

此函数是否转义( ) . [ ] * ^ $?为什么只有那些字符在SQL中转义了?

2 个答案:

答案 0 :(得分:1)

我发现了一个excerpt from the book you mention,发现该函数不是为了逃避SQL注入漏洞而设计的。我以为是,因此临时考虑了您的问题。我认为其他评论者也在做同样的假设。

该函数实际上是关于转义要在正则表达式中使用的字符。在正则表达式中有几个具有特殊含义的字符,因此,如果要搜索这些文字字符,则需要对其进行转义(以反斜杠开头)。

这与SQL无关。如果您想使用grepsedperlvim或任何其他使用正则表达式搜索的程序逐字搜索字符,则需要转义相同的字符

答案 1 :(得分:0)

不幸的是,sql数据库中的活动字符是一个未解决的问题。每个数据库供应商都使用自己的(主要是oracle的mysql,使用\转义序列)

转义'(这是用于值的字符串定界符)的官方SQL方法是将'翻倍,如''中一样。

那应该是确保SQL语句透明的唯一方法,并且是在字符串中引入适当的'的唯一方法。只要有任何供应商承认\'作为报价的同义词,您就可以支持所有额外的转义序列来分隔字符串。假设您有:

'Mac O''Connor' (should go into "Mac O'Connor" string)

并假设逃脱'的唯一方法是...那么,当您看到'的{​​{1}}序列时,您必须检查下一个字符,并且:

  • 您将获得'',您将转换为''
  • 您得到另一个,并终止字符串文字并将char作为下一个标记的第一个进行处理。

但是,如果您也承认'也是转义符,则必须检查\\'\\'(最后一个应转换为{ {1}}输入)等。如果您没有发现特殊情况,则可能会遇到麻烦

  • \\\'(应将\'作为SQL强制进行处理,还是第一个\''要转义第一个'',而第二个是字符串结尾引号?)< / li>
  • \'(应将'转换为单个\\'',然后\\应该是字符串终止符,还是我们必须切换到SQL编码方式并考虑将\作为单引号?)

您必须检查数据库文档,以查看'作为转义字符是否仅影响特殊字符(如控制字符等)的编码,并且还影响引号字符的解释或根本就没有,而您必须以其他方式逃避''

这就是供应商将用于将字符文字转义/转义的函数包含到要嵌入到SQL语句中的值中的原因。攻击者的想法是(如果未正确执行)将转义序列包括在他们发布给您的数据中,以查看是否允许他们修改sql命令的文本以简单地添加分号\并编写一个完整的sql语句,使他们可以自由访问您的数据库。