0

セキュリティの問題は通常、ユーザーの入力に起因することを理解しています。そのため、$ eFlag!=1の他の部分にセキュリティホールがあると想定しています。
私はphpに精通していないので、ここで何が起こっているのか100%確信が持てません。

アップロードされているファイル自体が悪意のある実行可能ファイルである可能性があり、チェックされていないと思いますか?もしそうなら、実行可能ファイルのアップロードを防ぐ方法、または単に.docファイルをアップロードする方法はありますか(プログラムが必要とするファイルのように見えます)?

***これは私が学校に通っているクラブの1つに投稿され、セキュリティホールを特定するように求められました(言い換えれば、確かに1つあります)。

4

2 に答える 2

2

アップロードされたファイルのmimeタイプを確認する必要があります。

strcmp(substr(mime_content_type($_FILES['userfile']['tmp_name']),0,4),"doc"

mimeタイプをチェックするためのphp.netの完全な例:http://php.net/manual/en/function.mime-content-type.php

ファイル名の名前と長さのフィルターが追加された完全なコード(これはファイル名に基づいています):

$match = preg_match_all("/^[a-zA-Z0-9]/$", $_FILES['userfile']['name'], $matchif);

if (!$matchif)
{
    die('not allowed filename');
}

if (strlen($_FILES['userfile']['name']) > 255 || strlen($_FILES['userfile']['name'] == 0))
{
    die('Filename length not allowed');
}

if (strcmp(substr(mime_content_type($_FILES['userfile']['name']),0,4),"doc")==0) 
{ 

    if (move_uploaded_file($_FILES['userfile']['tmp_name']))
    {
        // upload file
    }
    else die('not upload');

}
else die('support only doc');

例として、条件をダンプして使用し、mimetypeをチェックできます。

var_dump($_FILES['userfile']['type']);

if ($_FILES['userfile']['type'] == 'application/msword') { ... move uploaded files ...  }

注意:mimeタイプは偽造される可能性があるため、ファイル名、$ _ FILES、ファイル名の長さを介してタイプを確認し、コードの最初の行を読み取ってDOCまたはその他のものかどうかを確認します。メモ帳でドキュメントを開き、ファイルを読んでPHPで何を確認できるかを確認します。

于 2012-10-21T22:24:21.390 に答える
0

一般に、アップロードされたファイルを呼び出すには、直接または間接の2つの方法があります。

直接的な方法は、そのURLで呼び出すことです。その場合、Webサーバーにそれをどうするかについてのヒントを与えるのはファイル名拡張子です。したがって、ファイルが実行可能(つまり実行可能ではない.php)のファイル名拡張子で保存されていないこと、またはファイルがHTTP経由で到達できない場所に保存されていることを確認する必要があります。

間接的な方法は、などを使用してアップロードされたファイルを別の呼び出されたファイルに含めることです。したがって、などの引数がパラメータ化されている場合は、パラメータをユーザー入力で操作できないことincludeを確認する必要があります。そうしないと、リモートに対して脆弱になります。 /ローカルファイルインクルードinclude

于 2012-10-22T05:26:20.653 に答える