我目前在我的软件中使用该代码,检查文件扩展名是否安全或有没有办法绕过它?
$ext = explode('.',$_FILES['file']['name']);
$extension = end($ext);
if($extension == 'jpg' || $extension == 'png' || $extension == 'JPG' || $extension == 'jpeg' || $extension == 'gif' || $extension == 'pjpeg' || $extension == 'x-png'){
$extension = $extension;
}
else {
echo 1;
die();
}
谢谢..
答案 0 :(得分:2)
有没有办法绕过它?
绕过它的一种方法是简单地重命名文件..
毕竟,您目前只是检查文件名部分。
为了安全地处理图片上传,OWASP建议使用重写方法。
在PHP中,您可以通过使用gd或imagick加载图像并根据输入保存新图像来实现此目的。这可能听起来像是一个相对无用的步骤,但它确保你真正处理图像是一种非常安全的方式。
修改:另请参阅this answer。
答案 1 :(得分:0)
我个人不建议仅单独检查文件扩展名。根据您当前的方法,您需要考虑几点:
因此,按照Stratadox之前的回答,我也会阅读这个OWASP Unrestricted File Upload页面。 Stratadox友情提供的OWASP链接更多地关注预防技术,我提供的链接更多是攻击方面。我认为这应该有所帮助。
总之,您可以保留当前的文件扩展名检查,但可以在if语句中扩展一些更高级的检查。上面已经提到的好建议是本机PHP图像检查功能/库,例如gd或imagick。
注意 - 始终研究任何本机PHP图像检查功能/库是否存在安全漏洞(Google会提供帮助),并确保正确配置功能/设置。这是一个很好的做法,让你成为一个更安全的开发人员(并赚取一些大的$):))
希望这有帮助。
答案 2 :(得分:-1)
最好的方法是:
<?php //A function to return the extension if you'll want use IT
function EXTENSION($sr){
$path_parts = pathinfo($sr);
$exte='.'.$path_parts['extension'];
return $exte;
;}
;?&GT;
<?php
//OR Other way
// then test if is a Pic
list($width, $height, $type, $attr) = getimagesize($_FILES["file"]['tmp_name']);
if(preg_match("#.jpg|.jpeg|.png|.gif#i", $_FILES['file']['name']) AND $width > 2 ){
//Do what you want
;}else{
echo 1;
die();
;}
;?>
像这个兄弟一样非常安全。