2013-02-02 45 views
1

我的网站有上传配置文件的图像部分,我已经使用了下面的代码。绕过形式输入字段上传不需要的文件

表单代码

<form action="send.php" method="post" enctype="multipart/form-data" name="send" id="send"> 
    Your Image : <input type="file" name="pic" id="pic"/> 
    <input type="Submit" name="Submit" value="Submit"/> 
</form> 

PHP代码send.php

$ImageName = $_FILES[pic][name]; 
if(!empty($ImageName) && $_FILES[pic][type] == "image/jpeg" || $_FILES[pic][type] == "image/png" || $_FILES[pic][type] == "image/gif" || $_FILES[pic][type] == "image/bmp"){ 
    $t = time(); 
    $NewImageName = "$t$ImageName"; // image new name 
    copy($_FILES[pic][tmp_name], "users/$NewImageName"); // copy it to directory 
} else { 
    echo "no upload done"; 
} 

但是,通过使用Firefox扩展有人设法绕过它,并上载PHP文件 上传者发送文件到我的网站我的消息说:“你只检查类型!” 并表示“我使用了可以伪造输入字段并通过PHP文件的firefox扩展”。

所以我的问题我该如何保护我的图片上传形式的上述代码? 〜感谢

+2

你可以做保护文件夹,即使用户上传php文件,那么PHP文件将不会在该上传文件夹中执行。 –

+1

也许你需要这样的东西:https://github.com/qeremy/image –

回答

3

首先,我不认为这是阅读$ _FILE变量

$ImageName = $_FILES[pic][name]; 

有效的格式,您应该使用

$ImageName = $_FILES['pic'][name]; 

那么我认为这是不可能的,有人可以假货服务器端检查。

尝试破解这个问题,我使用* PATHINFO_EXTENSION *为PHP.net Manual

$validFormat = array("jpg","JPG","jpeg","JPEG","png","PNG","gif","GIF");  
$path = pathinfo($_FILES['pic']['name'], PATHINFO_EXTENSION); 
if(in_array($path, $validFormat)){ 
// it's okay 
}else{ 
// Error 
} 

提到我与此代码的工作,因为我前一段时间发现PATHINFO,没有人攻击它..

+0

是的,你是对的+1你:P –

+0

谢谢,作品完美,并停止传递不需要的文件扩展名。 –

+0

@杰克本接受回答:) –

3

$_FILES数组中的"type"条目实际上只是客户端发送的值。不要相信他们。

文件不是基于客户端提供的MIME类型(或从其数据中识别的MIME类型)执行的,而是仅由其扩展名执行。

$imageName = $_FILES['pic']['name']; 

if (isset($imageName)) { 
    $ext = pathinfo($imageName, PATHINFO_EXTENSION); 
    if (in_array(strtolower($ext), array('jpg', 'jpeg', 'gif', 'png', 'bmp')) { 
     $t = time(); 
     $newImageName = $t . basename($imageName); 
     copy($_FILES['pic']['tmp_name'], 'users/' . $newImageName); 
    } 
} else { 
    echo 'no upload done'; 
} 

注意调用到pathinfo得到延伸,并basename避免path traversal attacks

+1

或明确排除扩展名。虽然包容性过滤比独家更好。 ^^ – Jon

+0

非常感谢,并且在测试时没有传递不需要的文件。 –

相关问题