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

 

文件白名单

  • 只允许必要的扩展名(如 .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 攻击原理​​

攻击者利用网站对用户输入的不当处理,将恶意代码插入到网页中,浏览器无法区分这些代码是网站的正常内容还是攻击代码,因此会直接执行。

​​典型攻击流程​​

  1. ​​攻击者提交恶意代码​​(如 <script>alert('XSS')</script>)。
  2. ​​网站未过滤或转义该输入​​,直接存储或输出到页面。
  3. ​​其他用户访问该页面​​,浏览器执行恶意脚本。
  4. ​​攻击成功​​(如窃取 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 转义​​:&lt; → <&gt; → >
    • ​​JavaScript 转义​​:\x3Cscript\x3E
    • ​​URL 编码​​:%3Cscript%3E
posted @ 2025-05-07 19:10  幽暗天琴  阅读(103)  评论(0)    收藏  举报