php - 从 Sharepoint 上传时文件扩展名无效

标签 php html sharepoint file-upload

我有一个正在运行的网站,该网站使用文件上传。除了其中一位用户之外,一切都工作正常。他们使用 IE8 将文件从 SharePoint 服务器上传到网站。当我查看 PHP 中的 $_FILES 变量时,“name”键如下所示:

somefilename[1]

而不是

somefilename.pdf

然后上传将被阻止,因为不允许扩展。有人曾经处理过/见过这个吗?它看起来像一个临时名称,或者隐藏的文件扩展名。

编辑:

你们中的一些人请求了 $_FILES 变量:

[Filedata] => Array
    (
        [name] => Algemene%20Voorwaarden%20Corporate%20Services%202011[2]
        [type] => application/octet-stream
        [tmp_name] => /tmp/phps19zye
        [error] => 0
        [size] => 148021
    )

这应该是一个 PDF 文件。我需要扩展,不仅出于安全原因,[类型] 更适合于此,而且还出于演示和功能。我需要显示文件类型的正确图标,以及单独的图像进行处理。

HTML 表单只是一个基本的测试表单:

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <form action="uploadtest3.php" method="post" enctype="multipart/form-data">
            <input type="file" name="file_upload" id="file_upload" />
            <br /><input type="submit" value="Uploaden" />
        </form>
    </body>
</html>

PHP 文件如下:

$targetFolder = '/uploadtests/uploads3';

if (!empty($_FILES)) {
    $tempFile = $_FILES['file_upload']['tmp_name'];
    $targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;
    $targetFile = $targetPath . $_FILES['file_upload']['name'];

    move_uploaded_file($tempFile,$targetFile);
        echo "OK";
}

最佳答案

简介

以前见过这个问题,但不确定是什么原因造成的。我什至不想称其为错误,因为某些文件扩展名可能会出于恶意目的而被故意删除或更改

重要的是正确验证文件,不用担心文件是否有扩展名

原因:

  • 文件扩展名很容易被伪造,如果您的应用程序仅依赖文件扩展名进行验证,那就不好了

  • $_FILES ['file_upload']['type'] 将为所有没有扩展名的文件返回 application/octet-stream 因此它也不会验证选项

  • 由于它是浏览器问题,因此它是一个客户端相关问题,因此您没有任何控制权。如果您能够管理这一点,您肯定会提高用户体验

简单补丁

解决方案非常简单。您只需使用 FILEINFO 验证文件并修复上传文件的任何扩展名问题即可。

您还需要根据 Mime 类型验证所有上传的文件...并删除任何无效文件。

概念验证

$allowedTypes = array (
        "pdf" => "application/pdf" 
);

$pathFinal = "final";
$pathTemp = "temp";
try {
    if (! empty ( $_FILES )) {
        $tempFile = $_FILES ['file_upload'] ['tmp_name'];
        $fileName = $_FILES ['file_upload'] ['name'];
        $destinationTemp = $pathTemp . DIRECTORY_SEPARATOR . $fileName;
        $destinationFinal = $pathFinal . DIRECTORY_SEPARATOR . $fileName;
        /**
         * Move To tempary File
         */
        move_uploaded_file ( $tempFile, $destinationTemp );

        $fileMime = mimeInfo ( $destinationTemp );
        $key = array_search ( $fileMime, $allowedTypes );

        /**
         * Validate Mime Type
         */
        if (empty ( $key )) {
            unlink ( $destinationTemp );
            throw new Exception ( "File Type not Supported" );
        }

        /**
         * Fix Extention Issues
         */
        $ext = pathinfo ( $destinationTemp, PATHINFO_EXTENSION );

        if (empty ( $ext )) {
            $destinationFinal .= "." . $key;
        }

        /**
         * Transfer File to Original Location
         */
        copy ( $destinationTemp, $destinationFinal );
        unlink ( $destinationTemp );

        echo "OK";
    }
} catch ( Exception $e ) {
    echo "ERROR :", $e->getMessage ();
}

使用的函数

function mimeInfo($file) {
    return finfo_file ( finfo_open ( FILEINFO_MIME_TYPE ), $file );
}

关于php - 从 Sharepoint 上传时文件扩展名无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10400326/

相关文章:

javascript - 取消选择 radio 输入选择

javascript - 如何使用javascript中的request从网站/api获取图像并在html中使用img src显示它?

sharepoint - PowerShell无法捕获SharePoint Enable-SPFeature异常

php - 如何通过 PHP 将数据从 PostgreSQL 发送到 Android?

php - 在源代码中是否有一个标准的地方来放置版本号?

php - SQL 查询 - 包含不起作用的查询

javascript - 在 sharepoint spservice 中保存数据时如何检查验证是否失败

php - 我如何使用javascript将复选框数据传递给Textarea

javascript - Html:折叠按钮充当表单中的表单提交按钮

c#-4.0 - 使用客户端上下文和 CAML 查询删除共享点列表中的所有行