7

人々が写真をアップロードできる地元の非営利出版物用の簡単なページを作成しました (スクリプトと Stack の助けと友人の助けを使用して、PHP についてはほとんど知りません)。

私はセキュリティが得意ではありません (故意の過失ではなく、無知に基づいています) が、このページを保護するために次の手順を実行しました。

• PHP スクリプトは、.jpg、.png、および .tif ファイルのアップロードのみを受け入れるように設定されています。
• フォームのコンテンツを保存するサブフォルダーの権限は 700 に設定されており、アップロードされた写真を保存するサブフォルダーの権限は 700 に設定されています。
• ドキュメントによると、ホストには次の構成があり、.php ファイルのみが .php として実行されるようになっています。

<FilesMatch \.php$>
    SetHandler php52-fcgi
</FilesMatch>

• 関連する (メインおよび保存されたコンテンツ) フォルダーに .htaccess ファイルを配置しました。

RemoveHandler .php
RemoveHandler .inc
RemoveHandler .pl
RemoveHandler .cgi
RemoveHandler .py
RemoveHandler .fcgi

しかし、ある夜、何者かがこのテスト ページを見つけ、完全に無害と思われるテスト メッセージと小さな .jpg を送信しました。これは非直感的な URL を持つ非公開のテスト ページで、私と他の約 3 人だけが知っています。他の誰もこのテストを送信しませんでした。

これは明らかに、何かおかしいことが起こっているのではないかと心配しています。また、このページが安全であることを確認するためのセキュリティについて十分に知らないのではないかと心配しています.

私が行方不明であることは明らかですか?

4

4 に答える 4

8

アップロードされたものを扱うときは、 $_FILES 配列で見つけることができるすべてのデータが偽造される可能性があることに注意してください。これは HTTP を介して移動するため、イメージ/jpg の MIME をたとえば実行可能ファイルに渡すのは非常に簡単です。

1- 真の MIME を確認する

PHP には、ファイルの実際の MIME をチェックする関数がいくつか付属しています。そのためには、fileinfoを使用する必要があります

$finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic");
$filename = "/var/tmp/afile.jpg";
echo $finfo->file($filename);

2- 画像のプロパティを確認する

どうやら画像のみをアップロードしたいので、受信したファイルには幅と高さが必要です。

画像に関する必要な情報をすべて取得するには、getImageSize()を使用します。false が返された場合、ファイルはおそらく画像ではなく、削除できます。getImageSize は MIME タイプも提供できますが、信頼できるかどうかはわかりません。

2.5- 画像の再処理

user628405 が示唆しているように、GD で画像を再処理することは、おそらくより安全な方法です。

$img = imagecreatefrompng('vulnerable.png'); 
imagepng($img, 'safe.png');

明らかに、画像の種類に合わせて調整する必要があります。PHP ドキュメントのすべての imagecreatefrom* を参照してください。

3- アップロード フォルダー 既に行ったことに加えて、次のことを行います。

アップロード フォルダーが Web から利用できないことを確認します。アップロードされたファイルを検証し、必要に応じて別のフォルダーに移動し、ファイルの名前を変更します。ハッカーが悪意のあるファイルを実行するのを防ぎます (URL でアクセスできない場合は実行できません)。

さらに読む: https://www.owasp.org/index.php/Unrestricted_File_Upload

于 2012-09-07T13:42:09.187 に答える
4

コンテンツ タイプを含め、クライアントからのデータに依存しないでください。

アップロードされたファイルを Web ルートに保存しないでください。アップロードされたファイルは、より適切に制御するために、スクリプトを介してのみアクセスできるようにする必要があります。

アップロードされたファイルを元のファイル名と拡張子で保存しないでください。後で取得できるように、このデータをデータベースに保存します。

于 2012-09-07T13:45:41.787 に答える
0

ファイルの MIME タイプを確認できますが、php ハンドラーが .php ファイルしか実行できず、アップロードされた .php ファイルをスクリプトに保存しないように注意している限り、心配する必要はありません。セキュリティリーク。

これは、サーバーにインストールされている他のサーバー側スクリプト言語と同様に、.php ファイルにも有効です。

より良いアイデアは、ファイルシステムに保存するために受け入れている拡張子の白を保持することです.

于 2012-09-07T13:24:40.757 に答える
0

着信ファイルの MIME タイプとファイル拡張子は無視します。これらは偽造することができます。

その道を下る場合は、それらのファイルをディレクトリに保存します。

そのディレクトリが画像(音楽)専用であることを確認してから、ファイル形式を調べて正しい拡張子を配置するスクリプトを取得します。

また、そのディレクトリが PHP (またはその他のもの) を実行できないことを確認してください。

これにより、安全が保たれます。

于 2012-09-07T13:31:00.947 に答える