一 问题描述

用户登录时,登录功能各用户都是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


版权声明:本文为u010865136原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u010865136/article/details/77991094