php str_replace的替換漏洞

來源:互聯網
上載者:User

定義和用法
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));
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.