21

私はいくつかのサンプルをオンラインで見つけましたが、潜在的なセキュリティまたはパフォーマンスの考慮事項とその解決策について、PHP を日常的に使用している人々からフィードバックを得たいと思っています。

一度に 1 つのファイルをアップロードすることにのみ関心があることに注意してください。

理想的には、プラグインを使用する利点を知ることは興味深いですが、ブラウザー プラグイン (Flash/Java) は必要ありません。

最高の HTML フォーム コードと PHP 処理コードの両方を知りたいです。

4

4 に答える 4

34

ファイルアップロードのチュートリアル

HTML

<form enctype="multipart/form-data" action="action.php" method="POST">
  <input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
  <input name="userfile" type="file" />
  <input type="submit" value="Go" />
</form>
  • action.phpアップロードを処理する PHP ファイルの名前です (以下を参照)。
  • MAX_FILE_SIZEtype の入力の直前に指定する必要がありますfile。この値はクライアントで簡単に操作できるため、信頼しないでください。その主な利点は、ユーザーがファイルをアップロードする前に、ファイルが大きすぎることを早期に警告することです。
  • 入力の名前は type で変更できますがfile、スペースが含まれていないことを確認してください。PHP ファイル (以下) の対応する値も更新する必要があります。

PHP

<?php
$uploaddir = "/www/uploads/";
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "Success.\n";
} else {
    echo "Failure.\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);
print "</pre>";
?>

アップロード先フォルダーは、HTTP 経由でアクセスできる場所に配置しないでください。そうしないと、PHP スクリプトをアップロードしてサーバー上で実行できてしまいます。

の値を$_FILES出力すると、何が起こっているかについてのヒントを得ることができます。例えば:

    配列
    (
        [ユーザーファイル] => 配列
        (
            [名前] => ファイル名.拡張子
            [タイプ] =>
            [tmp_name] =>
            [エラー] => 2
            [サイズ] => 0
        )
    )

この構造は、ファイルの名前、MIME タイプ、サイズ、およびエラー コードに関する情報を提供します。

エラーコード

0 エラーがなく、ファイルが正常にアップロードされた
ことを示します。 1 ファイルが php.ini で定義された最大ファイル サイズを超えていることを示します。最大ファイル サイズを変更する場合は、php.ini ファイルを開き、次の行を特定する必要があり
ます。
3 ファイルが部分的にしかアップロードされていないことを示します
4 ファイルが指定されていないことを示します (空のファイル フィールド)
5 まだ定義されていません
6 一時フォルダーがないことを示します
7 を示しますファイルをディスクに書き込めないこと

php.ini構成

大きなファイルでこのセットアップを実行すると、エラーが発生する場合があります。php.iniファイルで次のキーを確認します。

max_execution_time = 30
upload_max_filesize = 2M

必要に応じてこれらの値を増やすと役立つ場合があります。Apache を使用している場合、このファイルを変更するには再起動が必要です。

memory_limitファイルはアップロード時に tmp ディレクトリに書き込まれるため、許容最大メモリ値 ( で設定) はここでは関係ありません。tmp ディレクトリの場所は、オプションで を介して制御されupload_tmp_dirます。

ファイルの MIME タイプの確認

ユーザーがアップロードしているファイルの種類を確認する必要があります。ベスト プラクティスは、許可されているファイルの種類のリストに対して検証することです。ファイルを許可することの潜在的なリスクは、ユーザーが PHP コードをサーバーにアップロードして実行できる可能性があることです。

MIME タイプを検証するには、非常に便利なfileinfo拡張機能 (古い関数に取って代わるもの) を使用できます。mime_content_type

// FILEINFO_MIME set to return MIME types, will return string of info otherwise
$fileinfo = new finfo(FILEINFO_MIME);
$file = $fileinfo->file($_FILE['filename']);

$allowed_types = array('image/jpeg', 'image/png');
if(!in_array($file, $allowed_types))
{
    die('Files of type' . $file . ' are not allowed to be uploaded.');
}
// Continue

詳しくは

PHP.net のマニュアルで、ファイルのアップロードの処理について詳しく読むことができます。

PHP 5.3 以降の場合

//For those who are using PHP 5.3, the code varies.
$fileinfo = new finfo(FILEINFO_MIME_TYPE);
$file = $fileinfo->file($_FILE['filename']['tmp_name']);
$allowed_types = array('image/jpeg', 'image/png');
if(!in_array($file, $allowed_types))
{
    die('Files of type' . $file . ' are not allowed to be uploaded.');
}
// Continue

詳しくは

FILEINFO_MIME_TYPE の詳細については、PHP.net のドキュメントを参照してください。

于 2008-10-13T18:07:13.140 に答える
5

あなたが知る必要があるすべてをあなたに伝えるはずのこの紹介を読んでください. ユーザーのコメントもかなり役に立ちます。

于 2008-10-13T17:41:34.860 に答える
4

Flash の主な利点は、複数のファイルをアップロードできることです。Java の主な利点は、ファイル システムからドラッグ アンド ドロップできることです。中心的な質問に答えなくて申し訳ありませんが、かなり単純なので、それを入れようと思いました。

于 2008-10-13T17:35:10.240 に答える
3

ファイルのアップロードに関してセキュリティは非常に重要です。アップロード フォルダーに .htaccess を追加して、スクリプトの実行を停止することは、セキュリティのレイヤーを追加するのに便利です。

.htaccess

Options -Indexes
Options -ExecCGI
AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .htm .shtml .sh .cgi 

参照: http://www.mysql-apache-php.com/fileupload-security.htm

于 2008-10-14T03:13:56.703 に答える