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

一 问题描述

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值