Php 仅允许.jpg和.png文件

Php 仅允许.jpg和.png文件,php,Php,可能重复: 如何使下面的脚本只允许.jpg图像或.png图像? 它根据会话用户名匹配将映像目录上载到mysql表。是否可以限制文件类型?因为我只需要.jpg或.png if ($_POST['submit']) { //get file attributes $Name = $_FILES['myfile']['name']; $tmp_name = $_FILES['myfile']['tmp_name']; error_reporting(E_ERROR

可能重复:

如何使下面的脚本只允许.jpg图像或.png图像? 它根据会话用户名匹配将映像目录上载到mysql表。是否可以限制文件类型?因为我只需要.jpg或.png

 if ($_POST['submit']) {
    //get file attributes

    $Name = $_FILES['myfile']['name'];
    $tmp_name = $_FILES['myfile']['tmp_name'];
    error_reporting(E_ERROR | E_PARSE);

    if ($Name) {            
    $location = "avatars/$Name";    
    move_uploaded_file($tmp_name, $location ) or die('Failed to upload picture'); 
    $query = mysql_query("UPDATE fgusers3 SET imagelocation='$location' WHERE name='$name'") or die("Your profile image has been uploaded!");

   }}



echo "Upload your image below:
  <form action='profilepic.php' method='POST' enctype='multipart/form-data'>
   Profile Picture: <input type='file' name='myfile'> <input type='submit' name='submit' value='upload'>
   </form>";
if($\u POST['submit'])){
//获取文件属性
$Name=$_文件['myfile']['Name'];
$tmp_name=$_文件['myfile']['tmp_name'];
错误报告(E|u错误| E|u解析);
如果($Name){
$location=“化身/$Name”;
移动上传的文件($tmp_name,$location)或死亡('Failed to upload picture');
$query=mysql\u query(“更新fgusers3设置imagelocation='$location',其中name='$name')或die(“您的个人资料图像已上载!”);
}}
echo“在下面上传您的图像:
个人资料图片:
";

您可以尝试使用
pathinfo
&
exif\u imagetype

if(pathinfo($Name,PATHINFO_EXTENSION) != "jpg" || exif_imagetype($Name) != IMAGETYPE_JPEG)
{
    // throw error 
}

您可以尝试使用
pathinfo
&
exif\u imagetype

if(pathinfo($Name,PATHINFO_EXTENSION) != "jpg" || exif_imagetype($Name) != IMAGETYPE_JPEG)
{
    // throw error 
}

您可以使用根据文件头检查文件的实际类型。这将根据文件的内容检查类型,因此它是最可靠的(例如,即使有人给你一个扩展名为“.png”的JPG,它也会为你提供正确的信息)

还有
type
属性(
$\u FILES['myfile']['type']
),它将为您提供浏览器声称文件为的MIME类型。但是,如果有人恶意伪造请求,则无法信任该请求。

您可以根据文件头检查文件的实际类型。这将根据文件的内容检查类型,因此它是最可靠的(例如,即使有人给你一个扩展名为“.png”的JPG,它也会为你提供正确的信息)

还有
type
属性(
$\u FILES['myfile']['type']
),它将为您提供浏览器声称文件为的MIME类型。但是,如果有人恶意伪造请求,则无法信任该请求。

$imageType=getimagesize($tmp\u name); 开关($imageType['mime']!=“image/jpg”或$imageType['mim']!=“image/png”){ //这里有错误代码。 }

这比检查扩展安全一点,因为扩展很容易更改。mime类型也可以更改,但需要更多知识xD

$imageType=getimagesize($tmp\u name); 开关($imageType['mime']!=“image/jpg”或$imageType['mim']!=“image/png”){ //这里有错误代码。 }


这比检查扩展安全一点,因为扩展很容易更改。mime类型也可以更改,但需要更多的知识xD

当然,您可以通过文件扩展名进行限制,但这并不安全。您可以尝试重命名gif文件并将其上载。更安全的一点是使用mime类型来检测文件类型(但仍然不能保证)。看看:


我认为更安全的方法是尝试获取图像的大小,或者如果成功转换为其他图像类型。

当然,您可以通过文件扩展名进行限制,但这并不安全。您可以尝试重命名gif文件并将其上载。更安全的一点是使用mime类型来检测文件类型(但仍然不能保证)。看看:


我认为更安全的方法是尝试获取图像大小,或者如果成功转换为另一种图像类型。

注意,欺骗扩展名、mime类型等有几种方法。在处理上载的文件时,请注意这一点。注意,欺骗扩展名、mime类型、,等等。在处理上传的文件时要注意这个事实。@hakre曾经说过。。。。。无论如何谢谢:)@hakre曾经说过。。。。。无论如何谢谢:)这安全吗?特别是反对将脚本上载到RCE?这是否安全?特别是反对将脚本上传到RCE?
if($_FILES){
    $allowedExtensions = array("jpg","png");

    foreach($_FILES as $key=>$val){
        if(!empty($val['tmp_name'])){
            $ext = end(explode(".",strtolower(basename($val['name']))));
            if(in_array($ext,$allowedExtensions)){
                $file = 'PATH_TO_UPLOAD'.basename($val['name']);

                if(move_uploaded_file($val['tmp_name'],$file)){
                    //SUCCESS_MESSAGE
                }
            }else{
                //FAIL_MESSAGE
            }
        }
    }
}