2

ファイルのアップロードを利用するWebサイトを稼働させています。ユーザーの 1 人を除いて、すべて正常に動作しています。IE8 を使用して、SharePoint サーバーから Web サイトにファイルをアップロードしています。PHP の $_FILES 変数を見ると、'name' キーは次のようになります。

somefilename[1]

それ以外の

somefilename.pdf

拡張機能が許可されていないため、アップロードはブロックされます。これまでにこれを扱った/見たことがありますか?一時的な名前、または隠しファイル拡張子のように見えます。

編集:

一部のユーザーは $_FILES 変数を要求しました:

[Filedata] => Array
    (
        [name] => Algemene%20Voorwaarden%20Corporate%20Services%202011[2]
        [type] => application/octet-stream
        [tmp_name] => /tmp/phps19zye
        [error] => 0
        [size] => 148021
    )

これは PDF ファイルである必要があります。セキュリティ上の理由だけでなく、[type] がそれに適しているだけでなく、プレゼンテーションと機能のためにも拡張機能が必要です。ファイルの種類に応じた正しいアイコンを表示し、処理のために別の画像を表示する必要があります。

HTML フォームは単なる基本的なテスト フォームです。

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <form action="uploadtest3.php" method="post" enctype="multipart/form-data">
            <input type="file" name="file_upload" id="file_upload" />
            <br /><input type="submit" value="Uploaden" />
        </form>
    </body>
</html>

PHPファイルは次のとおりです。

$targetFolder = '/uploadtests/uploads3';

if (!empty($_FILES)) {
    $tempFile = $_FILES['file_upload']['tmp_name'];
    $targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;
    $targetFile = $targetPath . $_FILES['file_upload']['name'];

    move_uploaded_file($tempFile,$targetFile);
        echo "OK";
}
4

3 に答える 3

1

somefilename配列のようです。ユーザーはアップロードするファイルを複数選択していますか?? アップロードできるファイルの数を制限するか、配列をキャッチして適切に処理する必要があります。また、Sharepoint が複数のファイルのアップロードを許可するように設定されていることを確認することもできます。

また、IE8 がファイルのアップロードをサーバーに渡す方法に関する情報も見つけました。ソース記事には次のように記載されています。

さらに、「ファイルのアップロード時にローカル ディレクトリ パスを含める」URLAction は、インターネット ゾーンに対して「無効」に設定されています。この変更により、潜在的に機密性の高いローカル ファイル システム情報のインターネットへの漏洩が防止されます。たとえば、フル パス C:\users\ericlaw\documents\secret\image.png を送信するのではなく、Internet Explorer 8 はファイル名 image.png のみを送信するようになりました。

これは、コード (または SharePoint) がファイル名からフォルダー構造をPATH_SEPで区切ろうとしている場合、IE8 では明らかに失敗することを意味します。

于 2012-05-03T19:55:26.047 に答える
1

序章

この問題は以前に見たことがありますが、原因がわかりません。some files extension can be intentionally removed or altered悪意のある目的のため、エラーとは言いたくありません。

ファイルに拡張子があるかどうかは、ほとんどimportant thing is validating file properly心配しません。

理由:

  • File Extension Can easily be fakedアプリケーションが検証のためだけにファイル拡張子に依存している場合、それは悪いことです

  • $_FILES ['file_upload']['type']拡張子のないすべてのファイルに対して返さapplication/octet-streamれるため、検証のオプションでもありません

  • これはブラウザの問題であるClient Related Problemため、制御することはできません。これを管理できれば、間違いなくユーザーエクスペリエンスが向上します

シンプルパッチ

解決策は非常に簡単です。FILEINFOファイルを検証し、アップロードされたファイルの拡張子の問題を修正するために必要なすべて。

また、Mime Type に基づいてアップロードされたすべてのファイルを検証し、無効なファイルを削除する必要があります。

概念実証

$allowedTypes = array (
        "pdf" => "application/pdf" 
);

$pathFinal = "final";
$pathTemp = "temp";
try {
    if (! empty ( $_FILES )) {
        $tempFile = $_FILES ['file_upload'] ['tmp_name'];
        $fileName = $_FILES ['file_upload'] ['name'];
        $destinationTemp = $pathTemp . DIRECTORY_SEPARATOR . $fileName;
        $destinationFinal = $pathFinal . DIRECTORY_SEPARATOR . $fileName;
        /**
         * Move To tempary File
         */
        move_uploaded_file ( $tempFile, $destinationTemp );

        $fileMime = mimeInfo ( $destinationTemp );
        $key = array_search ( $fileMime, $allowedTypes );

        /**
         * Validate Mime Type
         */
        if (empty ( $key )) {
            unlink ( $destinationTemp );
            throw new Exception ( "File Type not Supported" );
        }

        /**
         * Fix Extention Issues
         */
        $ext = pathinfo ( $destinationTemp, PATHINFO_EXTENSION );

        if (empty ( $ext )) {
            $destinationFinal .= "." . $key;
        }

        /**
         * Transfer File to Original Location
         */
        copy ( $destinationTemp, $destinationFinal );
        unlink ( $destinationTemp );

        echo "OK";
    }
} catch ( Exception $e ) {
    echo "ERROR :", $e->getMessage ();
}

使用する機能

function mimeInfo($file) {
    return finfo_file ( finfo_open ( FILEINFO_MIME_TYPE ), $file );
}
于 2012-05-08T17:13:11.213 に答える
0

ファイルの種類は、拡張子ではなく、MIMEの種類で確認する必要があります。変数$_FILES["uploaded_file"]["type"]を使用して、Mimeタイプを取得します。

このようにして、ユーザーは奇妙なASCII文字で拡張子を改ざんすることができず、どのファイルが何であるかを確実に知ることができます。

于 2012-05-03T17:50:20.537 に答える