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 相关文章推荐
?生?D片??C字串
Dec 06 PHP
用php过滤危险html代码的函数
Jul 22 PHP
PHP跳转页面的几种实现方法详解
Jun 08 PHP
php获取apk包信息的方法
Aug 15 PHP
php操作redis缓存方法分享
Jun 03 PHP
php数据库操作model类(使用__call方法)
Nov 16 PHP
php版阿里云OSS图片上传类详解
Dec 01 PHP
php 生成加密公钥加密私钥实例详解
Jun 16 PHP
Laravel框架用户登陆身份验证实现方法详解
Sep 14 PHP
PHP ADODB实现事务处理功能示例
May 25 PHP
PDO::lastInsertId讲解
Jan 29 PHP
PHP架构及原理知识点详解
Dec 22 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 simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
php json_encode奇怪问题说明
2011/09/27 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
javascript函数库-集合框架
2007/04/27 Javascript
用jscript实现新建和保存一个word文档
2007/06/15 Javascript
使用jquery给input和textarea设定ie中的focus
2008/05/29 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
深入理解Ajax的get和post请求
2016/06/02 Javascript
AngularJS过滤器filter用法实例分析
2016/11/04 Javascript
js遍历获取表格内数据的方法(必看)
2017/04/06 Javascript
微信小程序微信支付接入开发实例详解
2017/04/12 Javascript
vue组件 $children,$refs,$parent的使用详解
2017/07/31 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
vue中post请求以a=a&amp;b=b 的格式写遇到的问题
2018/04/27 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
JavaScript作用域链实例详解
2019/01/21 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
Python下rrdtool模块的基本使用方法
2015/11/13 Python
Python实现对字符串的加密解密方法示例
2017/04/29 Python
python 实现登录网页的操作方法
2018/05/11 Python
python中count函数简单的实例讲解
2020/02/06 Python
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
公司总经理任命书
2014/06/05 职场文书
七一建党节慰问信
2015/02/14 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
学生会任命书范本
2015/09/21 职场文书
2019各种承诺书范文
2019/06/24 职场文书
担保书范文
2019/07/09 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
Java实现二分搜索树的示例代码
2022/03/17 Java/Android