PHPでfile_put_contents関数を使用する方法

php中世界最好的语言
リリース: 2023-03-23 14:48:02
オリジナル
1854 人が閲覧しました

今回はPHPのfile_put_contents関数の使い方を紹介します。PHPでfile_put_contents関数を使用する際の注意点を実際のケースで見てみましょう。

最近、EIS の ファイルアップロード に関する質問に遭遇しました。< 長い間考えましたが、この質問は解決できませんでした。配列を使用してそれを回避できます。これが分析です。原理は理解できたので、これ以上は説明しません。

file_put_contents 関数の 2 番目のパラメーター データの公式 Web サイトの定義を見てみましょう:

data
要写入的数据。类型可以是 string,array 或者是 stream 资源(如上面所说的那样)。
 
如果 data 指定为 stream 资源,这里 stream 中所保存的缓存数据将被写入到指定文件中,这种用法就相似于使用 stream_copy_to_stream() 函数。
 
参数 data 可以是数组(但不能为多维数组),这就相当于 file_put_contents($filename, join(&#39;&#39;, $array))。
ログイン後にコピー

ご覧のとおり、データ パラメーターは配列にすることができ、これは自動的に join(&#39;&#39;,$array)string

に変換されます。

この関数がファイルにアクセスするとき、次のルールに従います:

  • FILE_USE_INCLUDE_PATH が設定されている場合、*filename* のコピーの組み込みパスがチェックされます

  • ファイルが存在しない場合は、ファイルが作成されます
  • ファイルを開きます
  • LOCK_EX が設定されている場合設定すると、ファイルはロックされます
  • FILE_APPEND が設定されている場合、ファイルの末尾に移動されます。それ以外の場合、ファイルの内容はクリアされます
  • ファイルにデータを書き込みます
  • ファイルを閉じてすべてのファイルのロックを解除します
  • 成功すると、関数はファイルに書き込まれた文字数を返します。失敗した場合は False が返されます。
ただし、文字列フィルタリング関数は通常、次のような preg_match 関数を使用してフィルタリングします。 strcmp、strlen、md5 など、文字列を処理する多くの関数は、配列が渡されるとエラーになり NULL を返すことがわかっています。ただし、preg_match 関数は、エラーが発生した場合に false を返します。ここでは、

を通じてそれを確認できます。この場合、preg_matchの通常のフィルタリングは無効となります

。 したがって、ファイルアップロードのコードは次のように記述されると思いますvar_dump(preg_match(&#39;/</&#39;,$data));

if(preg_match(&#39;/\</&#39;,$data)){
 die(&#39;hack&#39;);
}
ログイン後にコピー

したがって、次のように

を渡して

をバイパスすることができます content[]=&ext=php

修理方法

修正方法は、fwrite 関数を使用して危険な file_put_contents 関数を置き換えることです。fwrite 関数は文字列のみを渡すことができ、配列の場合はエラーになり false が返されます

<?php 
 
if(isset($_POST[&#39;content&#39;]) && isset($_POST[&#39;ext&#39;])){
 $data = $_POST[&#39;content&#39;];
 $ext = $_POST[&#39;ext&#39;];
 
 //var_dump(preg_match(&#39;/\</&#39;,$data));
 if(preg_match(&#39;/\</&#39;,$data)){
  die(&#39;hack&#39;);
 }
 $filename = time();
 file_put_contents($filename.$ext, $data);
}
 
?>
ログイン後にコピー
。この記事の事例については、オンラインの php 中国語のその他の関連記事に注目してください。

推奨読書:


以上がPHPでfile_put_contents関数を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート