[英]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 数据库中的活动字符是一个悬而未决的问题。 每个数据库供应商都使用自己的(主要是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.