首页 > 后端开发 > php教程 > phpmaster |使用PHP上传文件

phpmaster |使用PHP上传文件

William Shakespeare
发布: 2025-03-03 08:28:10
原创
618 人浏览过

phpmaster | Uploading Files with PHP

PHP 文件上传:构建安全可靠的上传系统

在线相册图片、邮件附件以及批量处理应用的数据文件,它们有一个共同点:都需要通过用户的网页浏览器将文件上传到互联网。文件上传功能是许多日常使用的网站和网络应用程序的重要组成部分。本文将向您展示如何使用 PHP 为您的网站添加文件上传支持。

关键要点

  • 在 PHP 中添加文件上传支持需要创建一个供用户使用的 HTML 表单和一个用于处理服务器上上传文件的 PHP 脚本。<form></form> 元素必须使用 POST 方法,并将 enctype 属性设置为 multipart/form-data。
  • 上传的文件首先存储在临时目录中。负责处理表单提交的 PHP 脚本会验证文件并进行处理,通常会将其从临时位置移动到更永久的位置。
  • 有关文件上传的信息通过多维数组 $_FILES 提供。move_uploaded_file() 函数将上传的文件从临时位置移动到永久位置,并执行额外的检查以确保文件确实是通过 HTTP POST 请求上传的。
  • 允许文件上传存在安全风险。为了减轻这些风险,可以验证上传文件的类型,对上传流量施加严格限制,并扫描病毒。通过用下划线替换任何非字母、数字或一组非常有限的标点符号的字符,确保安全的文件名也很重要。

先决条件

处理文件上传并不困难,但是有一些小的细节必须正确,否则上传将会失败。首先,您需要确保 PHP 配置为允许上传。检查您的 php.ini 文件并验证 file_uploads 指令是否设置为 On。

<code>file_uploads = On</code>
登录后复制
登录后复制
登录后复制
登录后复制

上传的文件首先存储在临时目录中(别担心……您的 PHP 脚本之后可以将文件移动到更永久的位置)。默认情况下,初始位置是系统的默认临时目录。您可以使用 php.ini 中的 upload_tmp_dir 指令指定不同的目录。无论如何,您应该验证 PHP 进程是否具有写入所用目录的适当权限。

<code>upload_tmp_dir = "/tmp"

tboronczyk@zarkov:~$ ls -l / | grep tmp
drwxrwxrwt  13 root root 40960 2011-08-31 00:50 tmp</code>
登录后复制
登录后复制
登录后复制

确定配置允许服务器接受上传的文件后,您可以将注意力集中在 HTML 细节上。与大多数来自 HTML 的其他服务器端交互一样,上传文件使用表单。您的 <form></form> 元素必须使用 POST 方法并将 enctype 属性设置为 multipart/form-data,这一点非常重要。

登录后复制
登录后复制

编写上传过程脚本

根据您自己的经验和刚才提到的要求检查,您可能已经猜到了文件上传的流程。

  • 访问者查看包含专门用于支持文件上传的表单的 HTML 页面。
  • 访问者提供他想要上传的文件并提交表单。
  • 浏览器对文件进行编码,并将其作为对服务器发出的 POST 请求的一部分发送。
  • PHP 接收表单提交,解码文件并将其保存在服务器上的临时位置。
  • 负责处理表单提交的 PHP 脚本验证文件并以某种方式处理它,通常将其从临时位置移动到更永久的位置。

添加文件上传支持需要您创建一个要呈现给用户的 HTML 表单和一个用于处理服务器上上传文件的 PHP 脚本。

HTML

HTML 表单提供用户启动文件上传的界面。请记住,<input> 元素的 method 属性必须设置为 post,enctype 属性必须设置为 multipart/form-data。一个文件 <input> 元素提供一个用于指定将要上传的文件的字段。像任何其他表单元素一样,提供 name 属性非常重要,以便您可以在处理表单的 PHP 脚本中引用它。以下是基本文件上传表单的标记示例:

<code>file_uploads = On</code>
登录后复制
登录后复制
登录后复制
登录后复制

值得注意的是,不同的浏览器会以不同的方式呈现文件字段。IE、Firefox 和 Opera 将其显示为带有旁边标记为“浏览”或“选择”的按钮的文本字段。Safari 将其呈现为仅标记为“选择文件”的按钮。这通常不是问题,因为用户习惯了该字段在其选择的浏览器中的呈现方式,并且知道如何使用它。但是,有时您会遇到坚持以某种方式呈现它的客户端或设计师。由于浏览器施加的安全原因,可以应用于文件字段的 CSS 和 JavaScript 的数量非常有限。样式化文件字段可能很困难。如果外观对您很重要,我建议您查看 Peter-Paul Koch 的《样式化 input type="file"》。

PHP

有关文件上传的信息通过多维数组 $_FILES 提供。此数组按分配给 HTML 表单中文件字段的名称进行索引,就像 $_GET$_POST 按名称进行索引一样。然后,每个文件的数组包含以下索引:

  • $_FILES["myFile"]["name"] 存储来自客户端的原始文件名。
  • $_FILES["myFile"]["type"] 存储文件的 MIME 类型。
  • $_FILES["myFile"]["size"] 存储文件的大小(以字节为单位)。
  • $_FILES["myFile"]["tmp_name"] 存储临时文件的名称。
  • $_FILES["myFile"]["error"] 存储传输过程中产生的任何错误代码。

move_uploaded_file() 函数将上传的文件从临时位置移动到永久位置。您应该始终为此目的使用 move_uploaded_file() 而不是 copy()rename() 等函数,因为它会执行额外的检查以确保文件确实是通过 HTTP POST 请求上传的。如果您计划使用用户提供的原始文件名保存文件,最好确保这样做是安全的。文件名不应包含任何可能影响目标路径的字符,例如斜杠。名称也不应该导致文件覆盖同名的现有文件(除非您的应用程序设计就是这么做的)。我通过用下划线替换任何非字母、数字或一组非常有限的标点符号的字符,然后在同名文件已存在时附加递增的数字来确保安全的文件名。以下是接收和处理 PHP 文件上传的示例:

<code>file_uploads = On</code>
登录后复制
登录后复制
登录后复制
登录后复制

这段代码首先确保文件上传没有错误。然后,它确定安全的文件名(如我刚才所述),然后使用 move_uploaded_file() 将文件移动到其最终目录。最后,调用 chmod() 以确保在新文件上设置了合理的访问权限。

安全注意事项

我们大多数人都不会让完全陌生的人在我们的个人电脑上存储随机文件,但当您允许在我们的应用程序中上传文件时,您实际上就是在做这件事。您可能打算让用户上传自己的照片作为个人资料页面,但如果他试图上传特别制作的、带有病毒的可执行文件怎么办?我想分享一些您可以采取的步骤,以最大限度地减少允许文件上传固有的安全风险。其中一个步骤是验证上传文件的类型是否正确。依赖 $_FILES["myFile"]["type"] 的值或文件名的扩展名是不安全的,因为两者都容易被伪造。相反,使用 exif_imagetype() 等函数检查文件的内容并确定它是否确实是 GIF、JPEG 或其他几种受支持的图像格式。如果 exif_imagetype() 不可用(该函数需要启用 Exif 扩展),则可以使用 getimagesize()getimagesize() 返回的数组将包含图像类型(如果识别)。

<code>upload_tmp_dir = "/tmp"

tboronczyk@zarkov:~$ ls -l / | grep tmp
drwxrwxrwt  13 root root 40960 2011-08-31 00:50 tmp</code>
登录后复制
登录后复制
登录后复制

对于非图像文件,您可以使用 exec() 来调用 unix file 实用程序。file 通过查找预期位置中的已知二进制签名来确定文件的类型。

<code>file_uploads = On</code>
登录后复制
登录后复制
登录后复制
登录后复制

您可以采取的另一个步骤是对 POST 请求的总大小和可以上传的文件数量施加严格限制。为此,请在 php.ini 中为 upload_max_size、post_max_size 和 max_file_uploads 指令指定适当的值。upload_max_size 指令指定文件上传的最大大小。除了上传的大小之外,您还可以使用 post_max_size 指令限制整个 POST 请求的大小。max_file_uploads 是一个较新的指令(在 5.2.12 版本中添加),它限制了文件上传的数量。这三个指令有助于保护您的网站免受试图通过造成大量网络流量或系统负载来破坏其可用性的攻击。

<code>upload_tmp_dir = "/tmp"

tboronczyk@zarkov:~$ ls -l / | grep tmp
drwxrwxrwt  13 root root 40960 2011-08-31 00:50 tmp</code>
登录后复制
登录后复制
登录后复制

您可以采取的第三个步骤是用病毒扫描程序扫描上传的文件。在当今病毒和恶意软件广泛传播的时代,这至关重要,尤其是在您的网站稍后允许其他个人下载上传的文件时,例如在基于 Web 的电子邮件客户端或(合法)文件共享网站中的附件。有一个 PHP 扩展程序可以访问 ClamAV,但是,当然,您可以像我为 file 演示的那样调用 ClamAV 的命令行实用程序。

登录后复制
登录后复制

总结

您已经了解了使用您的网站或基于 Web 的应用程序支持文件上传是多么容易。为了使上传成功,HTML 表单必须通过 multipart/form-data 编码的 POST 请求提交,并且 PHP 必须允许使用 file_uploads 指令指定的传输。文件传输后,负责处理上传的脚本使用在 $_FILES 数组中找到的信息将文件从临时目录移动到所需位置。我还分享了一些额外的预防措施,您可以采取这些措施来保护您自己和您的用户免受与允许文件上传相关的一些风险。您看到了如何确保文件名安全、验证文件类型、对上传流量施加严格限制以及扫描病毒。

(后续内容,例如常见问题解答部分,可以根据需要添加)

以上是phpmaster |使用PHP上传文件的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板