今回は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('', $array))。
ご覧のとおり、データ パラメーターは配列にすることができ、これは自動的に join('',$array)
string
この関数がファイルにアクセスするとき、次のルールに従います:
を通じてそれを確認できます。この場合、preg_matchの通常のフィルタリングは無効となります
。
したがって、ファイルアップロードのコードは次のように記述されると思いますvar_dump(preg_match('/</',$data));
if(preg_match('/\</',$data)){ die('hack'); }
を渡して
をバイパスすることができます
content[]=&ext=php
修正方法は、fwrite 関数を使用して危険な file_put_contents 関数を置き換えることです。fwrite 関数は文字列のみを渡すことができ、配列の場合はエラーになり false が返されます
<?php if(isset($_POST['content']) && isset($_POST['ext'])){ $data = $_POST['content']; $ext = $_POST['ext']; //var_dump(preg_match('/\</',$data)); if(preg_match('/\</',$data)){ die('hack'); } $filename = time(); file_put_contents($filename.$ext, $data); } ?>
以上がPHPでfile_put_contents関数を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。