使用 PHP 上传 DOC 或 PDF

2024-04-23

我可以很好地上传图像,但是当我将类型从 image/jpg、image/gif 更改为 application/msword 和 application/pdf 时,它不起作用。这是我的代码。完全相同的代码适用于图像,但对于上传文档和 pdf,它会输出“无效文件”。这里发生了什么?我的文件只有大约 30kb,远低于此处的文件大小限制。

$allowedExts = array("pdf", "doc", "docx"); 
$extension = end(explode(".", $_FILES["file"]["name"]));

if ( ( ($_FILES["file"]["type"] == "application/msword") || ($_FILES["file"]["type"] == "text/pdf") ) 
&& ($_FILES["file"]["size"] < 20000) && in_array($extension, $allowedExts))
{      
 move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); 
}
else
{
echo "Invalid file."
}

不要使用['type']验证上传的参数。该字段是用户提供的,并且可以轻松伪造,从而允许上传任何类型的文件。这同样适用于['name']参数 - 这是用户提供的文件名。伪造也很简单,因此用户发送nastyvirus.exe并称之为cutekittens.jpg.

验证上传的正确方法是使用服务器端 MIME 类型确定,例如通过fileinfo http://php.net/fileinfo,加上适当的上传成功检查,但您不需要:

if ($_FILES['file']['error'] !== UPLOAD_ERR_OK) {
    die("Upload failed with error " . $_FILES['file']['error']);
}
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
$ok = false;
switch ($mime) {
   case 'image/jpeg':
   case 'application/pdf'
   case etc....
        $ok = true;
   default:
       die("Unknown/not permitted file type");
}
move_uploaded_file(...);

您还使用用户提供的文件名作为 move_uploaded_files 最终目标的一部分。将路径数据嵌入到该文件名中也很简单,然后您就可以盲目地使用它。这意味着恶意远程用户可以在您的服务器上他们知道路径的任何文件上乱写,并植入新文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PHP 上传 DOC 或 PDF 的相关文章

随机推荐

  • 如何计算两个文本文档之间的相似度?

    我正在考虑使用任何编程语言 尽管我更喜欢 Python 来从事 NLP 项目 我想获取两个文档并确定它们的相似程度 常见的方法是将文档转换为 TF IDF 向量 然后计算它们之间的余弦相似度 任何有关信息检索 IR 的教科书都涵盖了这一点
  • 有没有办法使用 NamedParameterJdbcTemplate 和 generatedKeyHolder 提取主键(或 ROWID)?

    我正在尝试使用 Spring 的 NamedParameterJdbcTemplate 和 generatedKeyHolder 提取 ROWID 或主键 我正在尝试做这样的事情 MapSqlParameterSource paramete
  • 使用 .htaccess 限制对文件下载的访问

    我下载了诸如product exe之类的静态文件 我想限制访问 这些文件带有 htaccess 文件 以便只有某些用户可以下载它 我认为这可以用 mod rewrite 来处理 我在网上找到了这个片段 使用引荐来源网址阻止不良网站 Rewr
  • React-Native iOS - 如何通过按下按钮从 React-Native 视图导航到非 React-Native 视图(本机 iOS 视图控制器)?

    RN doco 和其他示例展示了如何从本机 iOS 视图控制器启动 React Native 视图 但反之则不然 有人可以解释我该怎么做吗 我能够弄清楚这一点 就我而言 我使用 Obj C 基础项目 这是 RN 默认值 和我自己的 Swif
  • Dynamics CRM 2011 - 找不到插件类型

    我正在尝试将插件部署到本地 Dynamics CRM 2011 该插件不执行任何操作 它只是一个空的Execute附加在 Post Process 事件上的方法Account entity 我的插件看起来像这样 namespace CrmD
  • 使用 cscope 在头文件和实现文件之间切换的 Vim 脚本

    我目前使用的是A vim http vim wikia com wiki Easily switch between source and header file在头文件和实现文件之间交换的插件 该脚本的局限性在于 它仅在两者位于同一文件夹
  • 开发期间初始安装标签的使用和验证

    我正在尝试在我们的应用程序中使用 ODR 并创建了标签并将其分组在 预取 下的 初始安装标签 选项下 我不确定如何使用开发配置文件在模拟器和设备上验证这一点 TestFlight 是验证初始安装标签使用情况的唯一选项吗 即使对于标记为初始安
  • websocket握手问题

    我正在使用 python 实现一个简单的 websocket 服务器 我使用的握手来自 握手本身似乎有效 但是当我点击发送时 我收到一个 JavaScript 错误 未捕获的错误 INVALID STATE ERR DOM 异常 11 这是
  • 使用易失性变量和信号量 - Java

    我从线程 信号量 易失变量等开始 我想知道当我使用信号量时是否有必要将变量定义为易失性 我的意思是 有 2 个线程 一个增加变量 另一个减少变量 例如 显然 在每次访问之前 我有一个互斥体 它随时控制只有一个线程正在 玩 变量 有必要定义为
  • 如何在java中排队并调用实际方法(而不是立即评估)?

    有一个对时间敏感的任务列表 但在这种情况下 时间 对于另一个程序告诉我的内容是任意的 它更像是 滴答声 而不是时间 但是 我不希望立即评估所述方法 我希望一个在另一个完成后执行 我在队列中使用链表 但我不确定如何 是否可以访问类中的实际方法
  • 为什么querySkuDetails需要在IO上下文中运行?

    根据https developer android com google play billing integrate https developer android com google play billing integrate th
  • 没有可判定的相等性或排除中间值的鸽巢证明

    在软件基础中IndProp v https softwarefoundations cis upenn edu lf current IndProp html lab244一个人被要求证明鸽巢原理 并且可以使用排除中间 但有人提到这并不是绝
  • 提交后用成功消息替换 HTML 表单,表单使用单独的 php 文件发送邮件

    我有一个内置于index html 中的html 联系表单 然后我有一个mail php 文件 用于发送邮件并使用一些Javascript 当我填写表单并提交时 我已对其进行编码以发送邮件 然后弹出一个成功消息框 然后重定向回index h
  • 从 C 中的路径中分割文件名

    我是 C 新手 但精通 Python 我正在寻找 C 中 string split 1 函数的功能等效项 到目前为止 我已经能够创建一个包含我的整个路径的字符数组 我想分割该字符串 所以我只有文件名 下面我提供了一个示例 char inpu
  • ERRORLEVEL 与 %ERRORLEVEL% 与感叹号 ERRORLEVEL 感叹号

    我想我对 ERRORLEVEL 与 ERRORLEVEL 有基本的了解 但是 ERRORLEVEL 让我困惑 我正在制作一个调用可执行文件的脚本 然后使用任务列表来查看它是否正在运行 然后使用taskkill来杀死它 如果是 然后尝试输出错
  • 如何在 Objective-C 的 switch 语句中使用 goto?

    在我的代码中 我需要能够在同一个 switch 语句中跳转 转到 不同的情况 有没有办法做到这一点 我的代码是这样的 有很多代码我都省略了 switch viewNumber case 500 break case 501 break ca
  • MATLAB - 函数的多个返回值?

    我正在 matlab 中编写 2 个函数 一个初始化函数和一个将项目插入数组的函数 将其视为双向链表 但是 我的初始化函数仅返回 ans 和初始化的数组 我怎样才能让它也设置其他变量的值 这是我的代码 function array list
  • Symfony2功能测试:直接传递表单数据

    我正在使用 phpunit 来运行功能测试 但我在使用某些表单时遇到问题 问题是 phpunit 不支持 JS 而我有一个带有动态填充选择框的表单 需要 jQuery 所以我需要直接传递表单数据 书 给出了以下例子 Directly sub
  • geom_tile单色为0,然后是色标

    我想生成一个热图 其中调色板为绿色到红色 但 0 值为白色 我开始了基于因子具有不同高填充颜色的 geom tile 热图 https stackoverflow com questions 10232525 geom tile heatm
  • 使用 PHP 上传 DOC 或 PDF

    我可以很好地上传图像 但是当我将类型从 image jpg image gif 更改为 application msword 和 application pdf 时 它不起作用 这是我的代码 完全相同的代码适用于图像 但对于上传文档和 pd