1

重複の可能性:
アップロードによるセキュリティの脅威

安全な画像アップロードのための優れたスクリプト/チュートリアルを探していましたが、見つけたものは何でも、コメントを読むと、セキュリティに関する限り、スクリプトに問題があるようです. だから私は自分のスクリプトを作成しようとしました。これに関するセキュリティに関する提案をお願いしたいと思います。

//create arrays from allowed extensions and types
$allowed_exts = array("jpg", "jpeg", "png", "gif");
$allowed_types = array("image/jpeg", "image/png", "image/gif");

//extract extension from uploaded file
$ext = strtolower(substr($_FILES["image"]["name"], strrpos($_FILES["image"]["name"], ".") + 1));

最初に、拡張機能が許可されているものの 1 つであるかどうかを確認します

 if(in_array($ext, $allowed_exts) === false){
    echo "Only .jpg, .png, .gif allowed";
    }

次に、タイプが許可されているものであるかどうかを確認します

 elseif(in_array($_FILES["image"]["type"], $allowed_types) === false){
    echo "Only .jpg, .png, .gif allowed";
    }

次に、ファイルサイズを確認します

elseif($_FILES["image"]["size"] > 2100000){
    echo "File is too big";
}

getimagesize を使用して寸法を確認します

   elseif(!getimagesize($_FILES["image"]["tmp_name"])){ 
    echo "File is not an image";
    } else {

ランダムなファイル名を作成します

$filename = mt_rand(1000,99999)."_".$_POST['p_id'].".jpg";

これで問題なければ、GD を使用して親指を作成します。要するに(jpegの場合):

a. imagecreatefromjpeg -> from uploaded file
b. imagecreatetruecolor -> with desired thumbnail dimensions
c. imagecopyresampled -> modify the image created under a.
d. imagejpeg -> save image to destination

したがって、これを読んだ限りでは、画像に伴うほとんどの問題は解消されるはずですが、何か重要なことを見逃していることは確かです。

ファイルを書き込むディレクトリには 755 のアクセス許可がありますが、フォルダーに .htaccess を配置して、ディレクトリにさらに制限を加える必要があると思いますか? そこには何がありますか?

4

1 に答える 1

0

しばらく前に文字列クリーンアップスクリプトを作成しましたが、役立つと思います。次のようにすべての $_POST アイテムをクリーンアップすることを忘れないでください:

//CLEAN-UP FUNCTIONS
function ms($v) {
     $v = str_replace("<br />","",$v); 
     $v = str_replace(" ","-",$v); 

     // Replace UTF-8 characters.
     $v = str_replace(
        array("\xe2\x80\x98", "\xe2\x80\x99", "\xe2\x80\x9c", "\xe2\x80\x9d", "\xe2\x80\x93", "\xe2\x80\x94", "\xe2\x80\xa6"),
        array("'", "'", '"', '"', '-', '--', '...'),$v);

     // Replace their Windows-1252 equivalents.
     $v = str_replace(
        array(chr(145), chr(146), chr(147), chr(148), chr(150), chr(151), chr(133)),
        array("'", "'", '"', '"', '-', '--', '...'),$v);
     // Finalize                    
     $v = htmlspecialchars($v, ENT_QUOTES);
     //$v = nl2br($v);
     return $v;
}

使用法:

$id = ms($_POST['p_id']);
于 2012-11-05T20:24:11.957 に答える