アカウント名:
パスワード:
C 言語の tempnam() ってセキュリティ的にはあまりよろしくない,みたいな話がありませんでしたっけ.ファイル名を作った後にどこかの誰かがそのファイル名のファイルを作ることができるので,云々みたいな.
PHP, というか Wordpress ではそのあたりうまいことやってるのかな.
ちょっと確認してみました。
まず前提として、C言語標準ライブラリの tempnam は、呼び出し時点では存在しないファイル名を生成しますが、ファイル生成などは行わないので、「呼び出してから、その戻り値をつかってファイル生成するまで」の間に、ファイル名の衝突が起こる可能性があるので、使っちゃダメ。tempnamの代わりに mkstempやmkdtemp と使えってことになってますが、こっちの関数は、ファイル名生成と同時にファイル/ディレクトリを作成します。そのため、mkstemp同士が衝突する心配はありません。
以上を踏まえた上で、
・PHPPHPには、C言語の標準ライブラリ関数と同仕様の、tempnam という組み込み関数がありますが、そのPHP関数のC言語実装(ext/standard/file.c)では、C言語のtempnam は使っていません。最終的に、main/php_open_temporary_file.c 内の php_do_open_temporary_file 関数が呼び出され、その中で、mkstemp を呼びだしてファイル名生成しています。
つまり、PHP の tempnam は、その名前とはうらはらに、使っても全然問題ない関数ってことで。
・Wordpresswp-admin/includes/files.php 内に定義された関数 wp_tempnam は、wp-includes/functions.php 内に定義された関数 wp_unique_filename を呼びだしており、wp_unique_filename は、自前で一時ファイルの生成を行っています。
その内容は…最終的に
while ( file_exists( $dir . "/$filename" ) ) { if ( '' == "$number$ext" ) $filename = $filename . ++$number . $ext; else $filename = str_replace( "$number$ext", ++$number . $ext, $filename );}
というループ処理になってます。tempnamと一緒で、ファイル名生成とファイル作成処理がアトミックじゃないので、これではファイル名が衝突しない保証がありません。このままでも、利用する側でアトミックなファイルオープンをしていれば問題ありませんが、ざっと見たかぎりでは、利用側では何も考えずに生成ファイル名にファイル出力するようなコードばかりでした…まあ、利用者が一人だけ、というような個人ブログレベルなら、まず問題ないでしょうけど…
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
開いた括弧は必ず閉じる -- あるプログラマー
C 言語の tempnam() (スコア:0)
C 言語の tempnam() ってセキュリティ的にはあまりよろしくない,みたいな話がありませんでしたっけ.
ファイル名を作った後にどこかの誰かがそのファイル名のファイルを作ることができるので,云々みたいな.
PHP, というか Wordpress ではそのあたりうまいことやってるのかな.
Re:C 言語の tempnam() (スコア:2)
ちょっと確認してみました。
まず前提として、C言語標準ライブラリの tempnam は、呼び出し時点では存在しないファイル名を生成しますが、ファイル生成などは行わないので、
「呼び出してから、その戻り値をつかってファイル生成するまで」の間に、ファイル名の衝突が起こる可能性があるので、使っちゃダメ。
tempnamの代わりに mkstempやmkdtemp と使えってことになってますが、こっちの関数は、ファイル名生成と同時にファイル/ディレクトリを作成します。そのため、mkstemp同士が衝突する心配はありません。
以上を踏まえた上で、
・PHP
PHPには、C言語の標準ライブラリ関数と同仕様の、tempnam という組み込み関数がありますが、
そのPHP関数のC言語実装(ext/standard/file.c)では、C言語のtempnam は使っていません。
最終的に、main/php_open_temporary_file.c 内の php_do_open_temporary_file 関数が呼び出され、その中で、mkstemp を呼びだしてファイル名生成しています。
つまり、PHP の tempnam は、その名前とはうらはらに、使っても全然問題ない関数ってことで。
・Wordpress
wp-admin/includes/files.php 内に定義された関数 wp_tempnam は、
wp-includes/functions.php 内に定義された関数 wp_unique_filename を呼びだしており、
wp_unique_filename は、自前で一時ファイルの生成を行っています。
その内容は…最終的に
というループ処理になってます。
tempnamと一緒で、ファイル名生成とファイル作成処理がアトミックじゃないので、これではファイル名が衝突しない保証がありません。
このままでも、利用する側でアトミックなファイルオープンをしていれば問題ありませんが、ざっと見たかぎりでは、利用側では何も考えずに生成ファイル名にファイル出力するようなコードばかりでした…
まあ、利用者が一人だけ、というような個人ブログレベルなら、まず問題ないでしょうけど…