为防止SQL注入攻击,《构建可扩展的网站》一书具有将正则表达式字符替换为转义版本的功能:
function db_escape_str_rlike($string) {
preg_replace("/([().\[\]*^\$])/", '\\\$1', $string);
}
此函数是否转义(
)
.
[
]
*
^
$
?为什么只有那些字符在SQL中转义了?
答案 0 :(得分:1)
我发现了一个excerpt from the book you mention,发现该函数不是为了逃避SQL注入漏洞而设计的。我以为是,因此临时考虑了您的问题。我认为其他评论者也在做同样的假设。
该函数实际上是关于转义要在正则表达式中使用的字符。在正则表达式中有几个具有特殊含义的字符,因此,如果要搜索这些文字字符,则需要对其进行转义(以反斜杠开头)。
这与SQL无关。如果您想使用grep
,sed
,perl
,vim
或任何其他使用正则表达式搜索的程序逐字搜索字符,则需要转义相同的字符
答案 1 :(得分:0)
不幸的是,sql数据库中的活动字符是一个未解决的问题。每个数据库供应商都使用自己的(主要是oracle的mysql,使用\
转义序列)
转义'
(这是用于值的字符串定界符)的官方SQL方法是将'
翻倍,如''
中一样。
那应该是确保SQL语句透明的唯一方法,并且是在字符串中引入适当的'
的唯一方法。只要有任何供应商承认\'
作为报价的同义词,您就可以支持所有额外的转义序列来分隔字符串。假设您有:
'Mac O''Connor' (should go into "Mac O'Connor" string)
并假设逃脱'
的唯一方法是...那么,当您看到'
的{{1}}序列时,您必须检查下一个字符,并且:>
''
,您将转换为''
。但是,如果您也承认'
也是转义符,则必须检查\
,\'
和\\'
(最后一个应转换为{ {1}}输入)等。如果您没有发现特殊情况,则可能会遇到麻烦
\\\'
(应将\'
作为SQL强制进行处理,还是第一个\''
要转义第一个''
,而第二个是字符串结尾引号?)< / li>
\'
(应将'
转换为单个\\''
,然后\\
应该是字符串终止符,还是我们必须切换到SQL编码方式并考虑将\
作为单引号?)等
您必须检查数据库文档,以查看'
作为转义字符是否仅影响特殊字符(如控制字符等)的编码,并且还影响引号字符的解释或根本就没有,而您必须以其他方式逃避''
。
这就是供应商将用于将字符文字转义/转义的函数包含到要嵌入到SQL语句中的值中的原因。攻击者的想法是(如果未正确执行)将转义序列包括在他们发布给您的数据中,以查看是否允许他们修改sql命令的文本以简单地添加分号\
并编写一个完整的sql语句,使他们可以自由访问您的数据库。