php str_replace的替换漏洞

2015-01-24信息快讯网

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 foreach 使用&(与运算符)引用赋值要注意的问题
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Memcache 在PHP中的使用技巧
PHP Memcached应用实现代码
两个开源的Php输出Excel文件类
php+mysql事务rollback&commit示例
Linux下将excel数据导入到mssql数据库中的方法
php addslashes和mysql_real_escape_string
关于php fread()使用技巧
PHP has encountered an Access Violation 错误的解决方法
php 操作excel文件的方法小结
PHP编程过程中需要了解的this,self,parent的区别
c#中的实现php中的preg_replace
PHP strtotime函数详解
Php 构造函数construct的前下划线是双的_
php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
MYSQL 小技巧 -- LAST_INSERT_ID
php 常用字符串函数总结
PHP执行速率优化技巧小结
Apache+php+mysql在windows下的安装与配置(图文)第1/2页
asp和php下textarea提交大量数据发生丢失的解决方法
apache rewrite_module模块使用教程
Http 1.1 Etag 与 Last-Modified提高php效率
使用 eAccelerator加速PHP代码的方法
实现php加速的eAccelerator dll支持文件打包下载
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
利用static实现表格的颜色隔行显示的代码
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
wordpress之wp-settings.php
php 中的str_replace 函数总结
加速XP搜索功能堪比vista
理解PHP5中static和const关键字的区别
©2014-2024 dbsqp.com