0

0

PHP主流架构如何实现文件上传_安全与存储【技巧】

星夢妙者

星夢妙者

发布时间:2025-12-27 23:08:02

|

162人浏览过

|

来源于php中文网

原创

PHP文件上传安全关键在于切断执行路径:上传目录须置于Web根目录外,或在Web服务器层禁用脚本执行;必须用finfo_open(FILEINFO_MIME_TYPE)校验真实MIME,配合后缀白名单与文件名清理。

php主流架构如何实现文件上传_安全与存储【技巧】

PHP文件上传时如何防止恶意文件执行

PHP默认不会阻止用户上传.php.phtml.htaccess等可被Web服务器解析的文件,一旦存到Web可访问目录,就可能被直接执行。关键不是“拦住什么后缀”,而是切断执行路径。

  • 上传目录**绝对不能**放在DocumentRoot下(如/var/www/html/uploads/),应移至Web根目录外,例如/var/www/storage/uploads/
  • 若必须放Web目录内,需在Web服务器层禁用脚本执行:Nginx中对上传目录加location ~ \.(php|phtml|php3|php4|php5|php7|php8|sh|pl|py|jsp|asp|aspx|cgi|exe|bat|cmd)$ { deny all; };Apache则用php_flag engine offRemoveHandler .php
  • 不要只依赖$_FILES['file']['type']——它由浏览器提供,完全可伪造;也不要只检查pathinfo($filename, PATHINFO_EXTENSION),因为shell.php.jpg仍可能被某些旧版Apache当作PHP执行

如何用finfo_open()做真实MIME校验

$_FILES['file']['type']不可信,getimagesize()只适用于图片,而finfo_open()能读取文件二进制头(magic bytes),是PHP里最可靠的MIME探测方式。

if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) {
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
    finfo_close($finfo);

    $allowed_mimes = ['image/jpeg', 'image/png', 'application/pdf'];
    if (!in_array($mime, $allowed_mimes)) {
        die('不支持的文件类型');
    }
}
  • 必须用FILEINFO_MIME_TYPE(不是FILEINFO_MIME),后者会返回带字符集的完整字符串,如text/plain; charset=us-ascii,匹配更复杂
  • 注意finfo_open()可能失败(如系统没装fileinfo扩展),需加if (!$finfo)兜底
  • 即使MIME合法,也要配合后缀白名单(如pdf只允许.pdf),因为攻击者可构造PDF头+PHP代码的混合文件

Laravel/Symfony等主流框架的上传存储实践差异

主流PHP框架已封装基础上传逻辑,但默认配置常忽略安全边界,需手动加固。

Amazon Nova
Amazon Nova

亚马逊云科技(AWS)推出的一系列生成式AI基础模型

下载
  • Laravel的$request->file('avatar')->store('avatars')默认存到storage/app/,该目录**不在Web路径下**,是安全的;但若用->storePublicly(),会存到public/storage/,此时必须确保Web服务器已禁用该目录下的PHP执行
  • Symfony的UploadedFile::move()不自动校验MIME,需手动调用finfo_open()或使用symfony/mime组件的MimeTypes::guessMimeType()
  • 所有框架都不处理文件名中的../或空字节(%00),上传前务必用basename()清理文件名,并过滤\0/\

大文件上传与分片上传的常见断点陷阱

PHP默认限制upload_max_filesizepost_max_size,但真正难处理的是超时、中断续传和重复提交。

立即学习PHP免费学习笔记(深入)”;

  • 前端分片上传时,服务端收到part_001part_002等临时块,**不要直接拼接并执行move_uploaded_file()**——攻击者可替换某一片为恶意内容,导致最终文件被污染
  • 建议用sha256_file()校验每一片哈希,再用hash_hmac('sha256', $content, $secret_key)签名整个文件ID,防止篡改分片顺序
  • PHP的max_execution_timemax_input_time在上传大文件时极易超时,应设为0(不限制)或改用异步队列(如Supervisor + Redis)处理最终合并
文件上传真正的难点不在“怎么传上去”,而在“怎么确保它永远无法被当作代码执行”——这个控制点横跨PHP配置、Web服务器配置、框架行为、前端交互四个层面,漏掉任何一层都可能让前面所有校验失效。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

1796

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1189

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1086

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

948

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1396

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1228

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1439

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1303

2023.11.13

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

27

2025.12.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号