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 简单日历实现代码
Oct 28 PHP
PHP 源代码压缩小工具
Dec 22 PHP
PHP 实用代码收集
Jan 22 PHP
PHP mcrypt可逆加密算法分析
Jul 19 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
Aug 06 PHP
php中创建和调用webservice接口示例
Jul 25 PHP
smarty中post用法实例
Nov 28 PHP
php调用KyotoTycoon简单实例
Apr 02 PHP
PHP模拟asp.net的StringBuilder类实现方法
Aug 08 PHP
ThinkPHP中使用Ueditor富文本编辑器
Sep 02 PHP
WordPress中对访客评论功能的一些优化方法
Nov 24 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
May 27 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与MySQL开发的8个技巧小结
2010/12/17 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
PHP使用ActiveMQ实例
2018/02/05 PHP
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
js读取注册表的键值示例
2013/09/25 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
浅谈javascript中字符串String与数组Array
2014/12/31 Javascript
AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
2015/01/02 Javascript
javascript比较两个日期相差天数的方法
2015/07/24 Javascript
js采用concat和sort将N个数组拼接起来的方法
2016/01/21 Javascript
javascript每日必学之继承
2016/02/23 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
基于JQuery打造无缝滚动新闻步骤详解
2016/03/31 Javascript
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
jQuery实现获取元素索引值index的方法
2016/09/18 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
JS实现评价的星星功能
2017/08/20 Javascript
详谈构造函数加括号与不加括号的区别
2017/10/26 Javascript
jQuery中的类名选择器(.class)用法简单示例
2018/05/14 jQuery
javascript递归函数定义和用法示例分析
2020/07/22 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
Python2.x中str与unicode相关问题的解决方法
2015/03/30 Python
django的登录注册系统的示例代码
2018/05/14 Python
python基于K-means聚类算法的图像分割
2019/10/30 Python
深入探究HTML5的History API
2015/07/09 HTML / CSS
Timberland法国官网:购买靴子、鞋子、衣服、夹克和配饰
2019/11/30 全球购物
光盘行动倡议书
2014/02/02 职场文书
致1500米运动员广播稿
2014/02/07 职场文书
《海底世界》教学反思
2014/04/16 职场文书
生产操作工岗位职责
2014/09/16 职场文书
2015年社区统计工作总结
2015/04/21 职场文书
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫