首頁 >後端開發 >php教程 >關於php中str_replace替換漏洞的分析

關於php中str_replace替換漏洞的分析

不言
不言原創
2018-06-21 14:08:463540瀏覽

這篇文章主要介紹了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(  
&#39;http://img.jb51.net/img/offer/29/24/70/20/29247020&#39;, 
&#39;http://img.jb51.net/img/offer/29/24/70/20/29247020-1&#39;, 
&#39;http://img.jb51.net/img/offer/29/24/70/20/29247020-2&#39; 
); 
$arr2 = Array( 
&#39;http://localhost/root/ups/af48056fc4.jpg&#39;, 
&#39;http://localhost/root/ups/cf33240aa3.jpg&#39;, 
&#39;http://localhost/root/ups/c30e40419b.jpg&#39; 
); 
$data = &#39; 
<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"/>&#39;; 
$data = str_replace($arr1,$arr2,$data); 
var_dump($data); 
?>

替換後的結果是: 

string(169) "897bd526896460bad3654b329b88a853d54a25ee9d3764fc76e9658aecf55af197efd6148154a3e97a145f8d11e8a2d8"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中filter_var() 函數與Filter 函數的分析

關於PHP截取字串的一些方法總結

#

以上是關於php中str_replace替換漏洞的分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn