php str_replace的替换漏洞

 更新时间:2008年03月15日 17:30:39   作者:  
php 的函数str_replace替换漏洞
定义和用法
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.jb51.net/img/offer/29/24/70/20/29247020',
'http://img.jb51.net/img/offer/29/24/70/20/29247020-1',
'http://img.jb51.net/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.jb51.net/img/offer/29/24/70/20/29247020"/>
<img src="http://img.jb51.net/img/offer/29/24/70/20/29247020-1"/>
<img src="http://img.jb51.net/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实时统计中文字数和区别

    今天小编就为大家分享一篇关于PHP统计实时统计汉字个数和区别,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • php实现scws中文分词搜索的方法

    php实现scws中文分词搜索的方法

    这篇文章主要介绍了php实现scws中文分词搜索的方法,详细介绍了scws中文分词搜索的具体步骤与相关使用技巧,并提供了scws的本站下载地址,需要的朋友可以参考下
    2015-12-12
  • PHP命名空间namespace的定义方法详解

    PHP命名空间namespace的定义方法详解

    这篇文章主要介绍了PHP命名空间namespace的定义方法,结合实例形式详细分析了php命名空间namespace及子命名空间的定义方法与相关注意事项,需要的朋友可以参考下
    2017-03-03
  • phpMyAdmin2.11.6安装配置方法

    phpMyAdmin2.11.6安装配置方法

    今天调试PHP数据库Mysql,在单位的电脑上安装phpMyAdmin数据库管理软件,本来是很简单的事,却出现了几个问题:1/无法载入mcrypt扩展,请检查PHP配置;/配置文件现在需要绝密的短语密码(blowfish_secret);3/#2003-服务器没有响应。
    2008-08-08
  • 解析php中两种缩放图片的函数,为图片添加水印

    解析php中两种缩放图片的函数,为图片添加水印

    本篇文章是对php中两种缩放图片的函数,为图片添加水印的方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP如何读取由JavaScript设置的Cookie

    PHP如何读取由JavaScript设置的Cookie

    本文主要介绍了PHP读取由JavaScript设置的Cookie的方法。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • Laravel模板引擎Blade中section的一些标签的区别介绍

    Laravel模板引擎Blade中section的一些标签的区别介绍

    这篇文章主要介绍了Laravel模板引擎Blade中section的一些标签的区别介绍,本文讲解了@yield 与 @section、@show 与 @stop、@append 和 @override的区别,需要的朋友可以参考下
    2015-02-02
  • PHP中list方法用法示例

    PHP中list方法用法示例

    这篇文章主要介绍了PHP中list方法用法,结合实例形式分析了list方法实现将数组值赋给变量的相关操作技巧与注意事项,需要的朋友可以参考下
    2016-12-12
  • php 判断字符串中是否包含html标签

    php 判断字符串中是否包含html标签

    本篇文章主要是对使用php判断字符串中是否包含html标签的实例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-02-02
  • PHP排序算法系列之直接选择排序详解

    PHP排序算法系列之直接选择排序详解

    这篇文章主要为大家详细介绍了PHP排序算法系列之直接选择排序的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01

最新评论