网站上传接口高危文件类型,以及关闭上传目录的执行权限,不影响文件正常访问,禁止恶意文件的执行

文件白名单:
-
只允许必要的扩展名(如
.docx而不是.doc,.xlsx而不是.xls)。 -
禁止
.exe、.js、.html、.php、.svg混入压缩包或伪装上传。
MIME 类型验证(后端读取文件头,防止伪造扩展名)
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $uploadedFile);
关闭Nginx上传目录执行权限
location /uploads/ {
# 拒绝解析 PHP、HTML 等脚本文件
location ~* \.(php|php5|phtml|html|js)$ {
deny all;
}
# 正常提供图片、文档等
autoindex off;
try_files $uri =404;
}
关闭Apache上传目录执行权限(.htaccess 文件放在上传目录如 /uploads/ 目录)
给.htaccess文件加上:
# 禁用 PHP 执行
php_flag engine off
# 禁用常见脚本类型解析
RemoveHandler .php .php3 .php4 .php5 .phtml .html .htm .js .svg
# 防止路径遍历
Options -Indexes
重命名文件保存(避免原名中含脚本、路径穿越等问题):
限制大小(防止 ZIP 炸弹攻击):.zip/.rar 文件设置最大解压后大小限制(后端判断),比如不超过 10MB
// 如果是SVG,过滤危险内容
if ($mimeType === 'image/svg+xml') {
$svgContent = file_get_contents($_FILES['file']['tmp_name']);
if (strpos($svgContent, '<?php') !== false || preg_match('/<script\b/i', $svgContent)) {
die("SVG 文件包含危险代码!");
}
}

PS:PHP防御XSS
XSS 漏洞(跨站脚本攻击)详解
XSS(Cross-Site Scripting) 是一种常见的 Web 安全漏洞,攻击者通过注入恶意脚本(通常是 JavaScript)到网页中,使其他用户在访问时执行这些脚本,从而窃取数据、劫持会话或进行其他恶意操作。
1. XSS 攻击原理
攻击者利用网站对用户输入的不当处理,将恶意代码插入到网页中,浏览器无法区分这些代码是网站的正常内容还是攻击代码,因此会直接执行。
典型攻击流程
- 攻击者提交恶意代码(如
<script>alert('XSS')</script>)。 - 网站未过滤或转义该输入,直接存储或输出到页面。
- 其他用户访问该页面,浏览器执行恶意脚本。
- 攻击成功(如窃取 Cookie、重定向到钓鱼网站等)。
2. XSS 攻击类型
(1) 反射型 XSS(非持久型)
- 特点:恶意代码存在于 URL 中,服务器返回时直接渲染执行。
- 触发方式:诱骗用户点击恶意链接。
- 示例:
url复制
http://example.com/search?q=<script>alert('XSS')</script>- 如果网站直接输出
q参数,就会执行脚本。
- 如果网站直接输出
(2) 存储型 XSS(持久型)
- 特点:恶意代码被存储到服务器(如数据库),每次访问受影响页面都会触发。
- 常见场景:留言板、评论、用户资料等。
- 示例:
html运行复制
<!-- 攻击者在评论区提交 --> <script>stealCookie()</script>- 其他用户查看评论时,脚本自动执行。
(3) DOM 型 XSS
- 特点:恶意代码通过前端 JavaScript 动态修改 DOM 触发,不经过服务器。
- 示例:
javascript复制
// 攻击者控制 URL 的 hash 部分 http://example.com#<script>alert('XSS')</script> // 前端代码错误地使用 location.hash document.write(location.hash.substring(1)); // 直接输出并执行
3. XSS 攻击的危害
- 窃取用户 Cookie(获取登录态)。
- 劫持用户会话(冒充用户操作)。
- 钓鱼攻击(伪造登录框)。
- 键盘记录(监听用户输入)。
- 篡改页面内容(插入广告或恶意链接)。
4. 如何防御 XSS?
(1) 输入过滤
- 对用户提交的数据进行严格校验(如只允许字母、数字)。
- 使用 PHP 的
htmlspecialchars()或htmlentities()转义特殊字符:php复制echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
(2) 输出转义
- 在输出到 HTML、JavaScript、CSS 或 URL 时,进行相应的编码:
- HTML 转义:
<→<,>→> - JavaScript 转义:
\x3Cscript\x3E - URL 编码:
%3Cscript%3E
- HTML 转义:

浙公网安备 33010602011771号