ホームページ >バックエンド開発 >PHPチュートリアル >PHPのstr_replace置換脆弱性の分析

PHPのstr_replace置換脆弱性の分析

不言
不言オリジナル
2018-06-21 14:08:463524ブラウズ

この記事では、主に php の str_replace 置換の脆弱性の分析を紹介します。これは、必要な友人に参照してもらうために共有します。

定義と使用法##。 #str_replace() 関数は、文字列を使用して文字列内の他の文字を置き換えます。

構文
str_replace(find,replace,string,count)
パラメータの説明
find 必須。検索する値を指定します。
交換が必要です。 find の値を置き換える値を指定します。
文字列が必要です。検索する文字列を指定します。
count オプション。置換の数をカウントする変数。

ヒントと注意事項 注: この関数では大文字と小文字が区別されます。大文字と小文字を区別しない検索を実行するには、str_ireplace() を使用してください。
注: この関数はバイナリ セーフです。

例 1

<?php 
echo str_replace("world","John","Hello world!"); 
?>

出力:


Hello John!

例 2
この例では、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) "3eb2f38278338ca4a4e43b8878dd816435e6a4c146d6e2e160c1819ac897c18a5d5bfe3d84ceb15f3616c37289d58a33"str_replace 関数の宣言はおそらく次のようになります: str_replace($search, $replace, $input[,&$count])。たとえば、文字列 $ を置換する場合input はソース文字列 (データ ソースと呼ばれます) ですが、str_pos、strtok、str_repeat およびその他の関数はすべて最初の位置、つまり 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 中国語に注目してください。 Webサイト!

関連する推奨事項:

PHP の filter_var() 関数と Filter 関数の分析

PHP の文字列インターセプトについていくつかの方法

以上がPHPのstr_replace置換脆弱性の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。