phpstr_replace的替换漏洞定义和⽤法
str_replace() 函数使⽤⼀个字符串替换字符串中的另⼀些字符。
语法
str_replace(find,replace,string,count)
参数描述
find 必需。规定要查的值。
replace 必需。规定替换 find 中的值的值。
字符串函数phpstring 必需。规定被搜索的字符串。
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(
'img.jb51/img/offer/29/24/70/20/29247020',
'img.jb51/img/offer/29/24/70/20/29247020-1',
'img.jb51/img/offer/29/24/70/20/29247020-2'
);
$arr2 = Array(
'localhost/root/ups/af48056fc4.jpg',
'localhost/root/ups/cf33240aa3.jpg',
'localhost/root/ups/c30e40419b.jpg'
);
$data = '
<img src="img.jb51/img/offer/29/24/70/20/29247020"/>
<img src="img.jb51/img/offer/29/24/70/20/29247020-1"/>
<img src="img.jb51/img/offer/29/24/70/20/29247020-2"/>';
$data = str_replace($arr1,$arr2,$data);
var_dump($data);
>
替换后的结果是:
string(169) "
<img src="localhost/root/ups/af48056fc4.jpg"/>
<img src="localhost/root/ups/af48056fc4.jpg-1"/>
<img src="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));
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论