繁体   English   中英

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

[英]What regular expression characters have to be escaped in SQL?

为防止SQL注入攻击,《Building Scalable Web Sites》一书中有一个用转义版本替换正则表达式字符的功能:

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

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

从你提到的那本书中找到了一个摘录,发现该功能不是为了防止SQL注入漏洞而进行的转义。 我认为是,并暂时考虑到这一点回答了您的问题。 我认为其他评论者也在做出同样的假设。

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

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

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

转义'的官方 SQL 方法(用于值的字符串分隔符)是将'加倍,如''

这应该是确保 SQL 语句透明的唯一方法,也是将正确的'引入字符串的唯一方法。 一旦任何供应商承认\\'作为引号的同义词,您就可以支持所有额外的转义序列来分隔字符串。 假设你有:

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

并假设转义'的唯一方法是...然后当您看到'''序列时,您必须检查下一个字符,并且:

  • 你得到''你变成'
  • 你得到另一个,你终止字符串文字并将字符处理为下一个标记的第一个。

但是如果你也承认\\作为转义符,那么你必须检查\\'\\\\'\\\\\\' (最后一个应该在输入时转换为\\' )等。如果你这样做,你可能会遇到麻烦不要将特殊情况检测为

  • \\'' (应该将''作为 SQL 指令处理,还是第一个\\'转义第一个'而第二个是字符串结束引号?)
  • \\\\'' (应该将\\\\转换为单个\\然后'应该是字符串终止符,还是我们必须切换到 SQL 编码方式并将''视为单引号?)

等等。

您必须检查您的数据库文档以查看\\作为转义字符是否仅影响特殊字符(如控制字符等)的编码,并且还影响引号字符的解释或根本不影响,并且您必须转义'另一种方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM