0

私はここ数週間このトピックを研究してきましたが、それに対する決定的な答えが見つからないというのは本当に私を悩ませ始めています。

ユーザーが自分のプロフィール写真をアップロードできるウェブサイトがあります。アップロードが許可されているファイルがJPEG、GIF、PNGのみであることを確認したい

明らかに、ブラウザから送信されたmimeタイプを使用して検証することは、簡単になりすましてそのルールを排除できるため、大したことではありません。ファイル拡張子で検証しないことは言うまでもありません。

次に、PHPが提供する新しい(ish)finfo関数があります。これは利用可能な最善の方法のように思われるので、当分の間これを使用していますが、http://www.php.net/manual/en/ref.fileinfo.phpのコメントを読むと、だまされる可能性もあるようです。また、返されるMIMEタイプがimage / jpeg、image / gif、またはimage / pngであるかどうかを確認するだけでは、制限が厳しすぎるかどうかわかりません。

次に、私が読んだgetimagesize()関数は、完璧に見える画像ではないものに対してfalseを返しますが、その場合、なぜここでfinfoを使用するという多くの受け入れられた答えがあるのですか?

最後に、system()またはexec()呼び出しがあります。これは、ユーザーがシステム呼び出しの一部を指定できるようにするのは少し危険なようです。

だから私の質問は、どの方法を使うべきかということです。スクリプトをできるだけ安全にするだけでなく、十分にオープンにして、通常のユーザーがスクリプトによって拒否された有効な画像で罰せられないようにしたい

4

2 に答える 2

0

これは私の 2 セントにすぎませんが、役に立つかもしれません。少なくとも以下の 3 つの手順を使用します。

  1. まず、getimagesize() と MIME タイプでファイルを確認します。
  2. ファイルの移動やサイズ変更などを行う場合は、ファイルを拡張子なしで保存します (画像は拡張子なしでレンダリングされます。
  3. 次のようなアップロード ディレクトリで htaccess を使用します。

    AddHandler cgi-script .php .php3 .php4 .php5 .phtml .pl .py .jsp .asp .shtml .sh .cgi .html .htm .js AddType テキスト/html *.htm *.html AddType アプリケーション/x-httpd -php-ソース *.php

これについても詳しく知りたいです!

于 2012-09-25T16:26:48.650 に答える
0

画像ライブラリを使用して開いてから再保存すると、結果が確実に画像になります。それを望まない場合は、利用可能な最適なオプション (finfo など) を使用し、サーバーによって実行されないようにファイルを保存してください。php などの拡張機能を禁止し、ファイルを任意の名前で保存することで問題は解決しますが、サーバーの構成によって異なります。

于 2012-09-25T16:30:23.713 に答える