この記事では主に 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) を通じて自動的に文字列に変換されます
この関数がファイルにアクセスするときは、次のルールに従います:
FILE_USE_INCLUDE_PATH が設定されている場合、*filename* のコピーの組み込みパスがチェックされます
ファイルが存在しない場合は、ファイルが作成されます
ファイルを開く
LOCK_EX が設定されている場合、ファイルはロックされます
FILE_APPEND が設定されている場合は、ファイルの末尾に移動します。それ以外の場合、ファイルの内容はクリアされます
ファイルにデータを書き込みます
ファイルを閉じて、すべてのファイルのロックを解除します
成功すると、関数はファイルに書き込まれた文字数を返します。失敗した場合は False が返されます。
ただし、文字列フィルタリング関数は通常、次のような preg_match 関数を使用してフィルタリングします。 strcmp、strlen、md5 など、文字列を処理する多くの関数は、配列が渡されると NULL を返すことがわかっています。しかし、preg_match 関数は、エラーが発生すると false を返します。ここでは、var_dump(preg_match('/<) を渡すことができます。 ;/',$data )); この場合、preg_match の通常のフィルタリングは無効になります
したがって、ファイルアップロードのコードは次のように記述されると思います
if(preg_match('/\</',$data)){ die('hack'); }
したがって、 content[]=&ext=php を渡して
をバイパスできます。 修正方法
修正するには、fwrite 関数を使用して、危険な file_put_contents 関数を置き換えることです。fwrite 関数は、配列の場合、エラーが false を返します。 PHP file_put_contents() 関数に関する記事
PHP で file_put_contents の追加と行の折り返しを実装するには?
PHPのfwriteとfile_put_contentsの違い
以上がPHPのfile_put_contents関数の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。