php str_replace的替换漏洞


Posted in PHP onMarch 15, 2008

定义和用法
str_replace() 函数使用一个字符串替换字符串中的另一些字符。

语法
str_replace(find,replace,string,count)

参数 描述
find 必需。规定要查找的值。
replace 必需。规定替换 find 中的值的值。
string 必需。规定被搜索的字符串。
count 可选。一个变量,对替换数进行计数。

提示和注释
注释:该函数对大小写敏感。请使用 str_ireplace() 执行对大小写不敏感的搜索。

注释:该函数是二进制安全的。

例子 1

<?php 
echo str_replace("world","John","Hello world!"); 
?>

输出:

Hello John!

例子 2
在本例中,我们将演示带有数组和 count 变量的 str_replace() 函数:

<?php 
$arr = array("blue","red","green","yellow"); 
print_r(str_replace("red","pink",$arr,$i)); 
echo "Replacements: $i"; 
?>

输出:
Array
(
[0] => blue
[1] => pink
[2] => green
[3] => yellow
)
Replacements: 1

例子 3

<?php 
$find = array("Hello","world"); 
$replace = array("B"); 
$arr = array("Hello","world","!"); 
print_r(str_replace($find,$replace,$arr)); 
?>

输出:

Array
(
[0] => B
[1] =>
[2] => !
)

漏洞相关函数:

<?php

$arr1 = Array( 
'http://img.3water.com/img/offer/29/24/70/20/29247020',
'http://img.3water.com/img/offer/29/24/70/20/29247020-1',
'http://img.3water.com/img/offer/29/24/70/20/29247020-2'
);
$arr2 = Array(
'http://localhost/root/ups/af48056fc4.jpg',
'http://localhost/root/ups/cf33240aa3.jpg',
'http://localhost/root/ups/c30e40419b.jpg'
);
$data = '
<img src="http://img.3water.com/img/offer/29/24/70/20/29247020"/>
<img src="http://img.3water.com/img/offer/29/24/70/20/29247020-1"/>
<img src="http://img.3water.com/img/offer/29/24/70/20/29247020-2"/>';
$data = str_replace($arr1,$arr2,$data);
var_dump($data);
?>

替换后的结果是:

string(169) "<img src="http://localhost/root/ups/af48056fc4.jpg"/><img src="http://localhost/root/ups/af48056fc4.jpg-1"/><img src="http://localhost/root/ups/af48056fc4.jpg-2"/>"str_replace 函数的声明大概是这样: str_replace($search, $replace, $input[,&$count]), 比如在对一个字符串进行替换操作, $input 就是源字符串(称为数据源). 这很不合理,因为它把数据源放在第3位, 而 str_pos, strtok, str_repeat 等等函数都是把数据源放在第1位.也就是说str_replace并没有替换掉数组中相对应的字符串,而是把数组中的第一个替换,然后把相同的字符串后多余的合并。

解决办法:
function strrplace($arr1,$arr2,$data){ 
if(is_array($arr1)) {  
foreach($arr1 as $key => $value)  {
   $data = str_replace_once($value, $arr2[$key], $data);
  } } 
return $data;
}
function str_replace_once($needle, $replace, $data) //替换第一次
{
$pos = strpos($data, $needle);
if ($pos === false) {
return $data; 
}
return substr_replace($data, $replace, $pos, strlen($needle));

PHP 相关文章推荐
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
Sep 30 PHP
全世界最小的php网页木马一枚 附PHP木马的防范方法
Oct 09 PHP
PHP 循环删除无限分类子节点的实现代码
Jun 21 PHP
解析strtr函数的效率问题
Jun 26 PHP
Win下如何安装PHP的APC拓展
Aug 07 PHP
PHP中redis的用法深入解析
Feb 20 PHP
php带抄送和密件抄送的邮件发送方法
Mar 20 PHP
PHP的APC模块实现上传进度条
Oct 27 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 PHP
php实例化对象的实例方法
Nov 17 PHP
PHP执行速率优化技巧小结
Mar 15 #PHP
请php正则走开
Mar 15 #PHP
可以在线执行PHP代码包装修正版
Mar 15 #PHP
PHP Token(令牌)设计
Mar 15 #PHP
php项目打包方法
Feb 18 #PHP
PHP4与PHP5的时间格式问题
Feb 17 #PHP
PHP5 面向对象程序设计
Feb 13 #PHP
You might like
第四章 php数学运算
2011/12/30 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
js分解url参数(面向对象-极简主义法应用)
2012/08/09 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
2015/08/20 Javascript
jQuery实现侧浮窗与中浮窗切换效果的方法
2016/09/05 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
2017/02/22 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
AngularJS实时获取并显示密码的方法
2018/02/06 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
通过实例解析vuejs如何实现调试代码
2020/07/16 Javascript
PHP 502bad gateway原因及解决方案
2020/11/13 Javascript
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
python 3.7.0 下pillow安装方法
2018/08/27 Python
Python 去除字符串中指定字符串
2020/03/05 Python
Python使用re模块验证危险字符
2020/05/21 Python
Html5+JS实现手机摇一摇功能
2015/04/24 HTML / CSS
大一期末自我鉴定
2013/12/13 职场文书
求职信的要素有哪些呢
2013/12/26 职场文书
怎样客观的做好自我评价
2013/12/28 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
2014中考励志标语
2014/06/05 职场文书
施工工地安全标语
2014/06/07 职场文书
团队拓展活动总结
2014/08/27 职场文书
关于教师节的演讲稿
2014/09/04 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
事业单位聘任报告
2015/03/02 职场文书
信访维稳承诺书
2015/05/04 职场文书
初一英语教学反思
2016/02/15 职场文书
最新的离婚协议书范本!
2019/07/02 职场文书
深入浅析python3 依赖倒置原则(示例代码)
2021/07/09 Python
Golang 字符串的常见操作
2022/04/19 Golang