0

次のPHPコードがあります

// Check if the upload is setted
if
(
    isset($_FILES['file']['name']) && !empty($_FILES['file']['name']) && 
    isset($_FILES['file']['type']) && !empty($_FILES['file']['type']) &&
    isset($_FILES['file']['size']) && !empty($_FILES['file']['size'])
)
{
    $UploadIsSetted = true;
    $UploadIsBad = false;

    $UploadExtension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);

    // Check if the upload is good
    require "../xdata/php/website_config/website.php";
    $RandomFoo = rand(1000999999,9999999999);

    if (($_FILES["file"]["size"] < ($MaxAvatarPictureSize*1000000)))
    {
        if ($_FILES["file"]["error"] > 0)
        {
            $UploadIsBad = true;
            $hrefs->item(0)->setAttribute("Error","true");
            $hrefs->item(0)->setAttribute("SomethingWrong","true");
        }
        else
        {
            move_uploaded_file($_FILES["file"]["tmp_name"],"../upload/tmp/".$RandomFoo.".file");    
        }
    }
    else
    {
        // The file is too big
        $UploadIsBad = true;
        $hrefs->item(0)->setAttribute("Error","true");
        $hrefs->item(0)->setAttribute("UploadTooBig","true");
    }
}
else
{
    $UploadIsSetted = false;
}

$ZipFile = new ZipArchive;
$ZipFile->open('../upload/tmp/'.$LastFilename.'.zip',ZIPARCHIVE::CREATE);
$ZipFile->addFile('../upload/tmp/'.$RandomFoo.'.file',$RandomFoo.".".$UploadExtension);
$ZipFile->close();

今私の大きな懸念は、ユーザーが何でもアップロードできるので、どうすれば防ぐことができるかということです:

  • 2GB 3GB ファイルのアップロード
  • フロード
  • 最終的にサーバーのセキュリティを変更する、ある種のねじれたエクスプロイトをアップロードする
  • バッファオーバーフロー
  • 任意のコード インジェクションを含むファイル名

つまり、このスクリプトはどれほど安全ですか?

今のところ Windows を実行していますが、Linux に切り替えます

4

2 に答える 2

1

その他の 4 つの質問:

フロード

それが複雑な部分です。いくつかのアイデアをグーグルで検索しましょう:

最終的にサーバーのセキュリティを変更する、ある種のねじれたエクスプロイトをアップロードする

コマンドライン ウイルス スキャナー (f-protまたはclamav) を使用して、アップロードされたファイルをスキャンします。PHP 自体で単純な正規表現スキャナーを使用することもできます (画像ファイル内の HTML っぽいコンテンツを調べるなど) が、これは実際のセキュリティ機能ではありません。車輪を再発明しないでください。

バッファオーバーフロー

一般に、PHP はバッファ オーバーフローの影響を受けません。

冗談です。しかし、それについてユーザーランドでは何もできません。しかし、文字列を押し回すことはそれほど問題ではありません。どのコンテキストで何をエスケープするかを知っている限り、これはスクリプト言語では非常に信頼性が高く、悪用できません。

任意のコード インジェクションを含むファイル名

少なくとも、パストラバーサルのエクスプロイトを回避するために、常に使用する必要があります。basename()ユーザー指定のファイル名を保持したい場合は、正規表現のホワイトリストが適切です。=preg_replace('/[^\w\s.]/', '', $fn)大まかな例として。

于 2012-07-02T18:03:43.187 に答える
0

あなたの行は、受け入れ可能なファイルのサイズをメガバイトif (($_FILES["file"]["size"] < ($MaxAvatarPictureSize*1000000)))にすでに制限しています。$MaxAvatarPictureSizeただし$MaxAvatarPictureSize、提供したコードには設定されていないようです。私の推測では、最大 1 または 2 である必要があります。また、設定されていない$LastFilenameものもあり、おそらく他にもいくつかあります。

またif($UploadIsBad === false) { /* do zipping */ }、Zipping 部分の周りに を配置して、大きすぎるファイルや無効なファイルを圧縮しないようにします。

于 2012-07-02T17:51:17.680 に答える