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 相关文章推荐
让你同时上传 1000 个文件 (一)
Oct 09 PHP
PHP 模板高级篇总结
Dec 21 PHP
兼容性最强的PHP生成缩略图的函数代码(修改版)
Jan 18 PHP
php 文件缓存函数
Oct 08 PHP
ThinkPHP 连接Oracle数据库的详细教程[全]
Jul 16 PHP
php和javascript之间变量的传递实现代码
Dec 19 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
Dec 25 PHP
理解PHP中的Session及对Session有效期的控制
Jan 08 PHP
深入解析WordPress中加载模板的get_template_part函数
Jan 11 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
Feb 15 PHP
Zend Framework前端控制器用法示例
Dec 11 PHP
PHP生成随机数的方法总结
Mar 01 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 加密解密内部算法
2010/04/22 PHP
php在window iis的莫名问题的测试方法
2013/05/14 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
jquery 问答知识整理
2010/02/11 Javascript
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
jcrop基本参数一览
2013/07/16 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
Jquery实现动态切换图片的方法
2015/05/18 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
JavaScript常用字符串与数组扩展函数小结
2016/04/24 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
2016/05/09 Javascript
jQuery Ajax 加载数据时异步显示加载动画
2016/08/01 Javascript
js改变透明度实现轮播图的算法
2020/08/24 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
详解vue+css3做交互特效的方法
2017/11/20 Javascript
解决vue中对象属性改变视图不更新的问题
2018/02/23 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
js实现扫雷源代码
2020/11/27 Javascript
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
python模块之paramiko实例代码
2018/01/31 Python
tensorflow实现softma识别MNIST
2018/03/12 Python
Ubuntu下Anaconda和Pycharm配置方法详解
2019/06/14 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
计算机开发个人求职信范文
2013/09/26 职场文书
学前教育学生自荐信范文
2013/12/31 职场文书
2014新年元旦活动策划方案
2014/02/18 职场文书
网络管理员岗位职责
2014/03/17 职场文书
导游个人求职信范文
2014/03/23 职场文书
地方课程教学计划
2015/01/19 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers
python实现简单的名片管理系统
2021/04/26 Python
Java中API的使用方法详情
2022/04/06 Java/Android