preg_replace—替换内容中包括$特殊符号时

来源:互联网 发布:js中div显示隐藏 编辑:程序博客网 时间:2024/06/05 19:12

一 问题描述

用户登录时,登录功能各用户都是ok的,某一用户出现登录失败的情况,经发现是此客户登录密码中包含特殊符号$。

二 分析问题

框架中where字段的拼接是通过preg_replace方式实现的,如下代码是一个精简的demo示例:


<?php
$str = "password = ?";
$value = "1$$$439u4";
$pattern[] = "/[']?\?[']?/";
$str = preg_replace($pattern, $value, $str, 1);
var_dump($str);exit;
?>

说明:$str为要拼接的where字段,需要将?替换为password的具体值$value,

preg_replace的第二个参数支持后向引用,即$n可以替换匹配模式$pattern中的第n个括号处理的子捕获组,n可以是0-99,

所以$value中包括$特殊符号并且后面跟有数字,这样$43便被解析为匹配模式中的第43个括号子捕获组(此处无43个,便替换为空),这样?被替换为了"1$$9u4",而不是"1$$$439u4",这样sql执行时和数据库里的密码不一致,便会登录失败。

三 解决问题

*在preg_replace前,先用其他符号替换$符号,执行preg_replace后,再用$符号替换回来,这样便可避免在preg_match时$被解析。


<?php
$str = "password = ?";
$value = "1$$$439u4";
$value = str_replace("$","问号",$value);
$pattern[] = "/[']?\?[']?/";
$str = preg_replace($pattern, $value, $str, 1);
$str = str_replace("问号","$",$str);
var_dump($str);exit;
?>


参考php手册:http://php.net/manual/zh/function.preg-replace.php

原创粉丝点击