文章目录
- OWASP 2023 TOP 10
- 导图
- 定义
- 攻击场景
- 1. 上传恶意脚本
- 2. 目录遍历
- 3. 覆盖现有文件
- 4. 文件上传结合社会工程攻击
- 防御措施
- 1. 文件类型验证
- 2. 文件名限制
- 3. 文件存储位置
- 4. 文件权限设置
- 5. 文件内容检测
- 6. 访问控制
- 7. 服务器配置
- 文件类型验证实现
- Hutool的`FileTypeUtil`
- 使用场景
- Java代码实现:基于Hutool的Magic Number验证
- 详细说明
- Hutool的FileTypeUtil工作原理
- 代码流程
- 支持的文件类型
- 防御措施分析
- 文件上传防御流程
- 组合攻击
- 文件上传与路径穿越
- 文件上传与代码注入
- 文件上传与CSRF
- 漏洞Code演示与修复
- 存在文件上传漏洞的代码
- 漏洞分析
- 修复示例
- 文件上传漏洞与其他常见漏洞的组合攻击
- 文件上传漏洞 + 路径穿越
- 攻击场景:绕过文件存储路径限制
- 高级利用步骤
- 防御措施
- 文件上传漏洞 + 远程代码执行(RCE)漏洞
- 攻击场景:利用脚本文件上传实现RCE
- 高级利用步骤
- 防御措施
- 文件上传漏洞 + 跨站脚本(XSS)
- 攻击场景:通过文件上传传播XSS攻击
- 利用步骤
- 防御措施
- 文件上传漏洞 + CSRF
- 攻击场景:利用CSRF强制上传恶意文件
- 利用步骤
- 防御措施
- 组合漏洞Code : 路径穿越与远程代码执行(RCE)
- 场景介绍
- 问题代码
- 漏洞分析
- 利用步骤
- 防御措施
- 修复代码
- 防御措施分析
- 详细说明
- 攻击原理
- 防御机制
OWASP 2023 TOP 10
OWASP Top 10 概述
OWASP (Open Web Application Security Project) Top 10 是一份最常见和最危险的Web应用安全风险列表,由安全专家定期更新。 旨在提高开发人员、测试人员以及组织的安全意识并帮助他们预防这些漏洞。
2023年OWASP Top 10 列表
主流防范措施
-
Broken Access Control
- 描述:未能正确执行访问控制,允许用户访问他们不应该拥有的权限或资源。这可能导致数据泄露、数据篡改等问题。
- 防御措施:严格实施基于角色的访问控制(RBAC),并确保敏感操作具有足够的授权检查。
-
Cryptographic Failures
- 描述:不当的加密实践或加密算法的使用不当,可能导致敏感数据(如密码、信用卡信息)被暴露或窃取。
- 防御措施:使用最新的加密标准(如AES-256-GCM、RSA-2048),并避免使用弱或过时的加密算法。
-
Injection
- 描述:应用未能对用户输入进行有效的验证或转义,导致恶意代码注入(如SQL注入、命令注入)并执行在服务器上。
- 防御措施:使用参数化查询、输入验证、输出转义技术,避免拼接SQL或动态代码。
-
Insecure Design
- 描述:系统在设计阶段未考虑安全问题,导致应用架构中的基本安全漏洞。
- 防御措施:在开发生命周期中引入威胁建模、攻击面分析等设计阶段的安全审查。
-
Security Misconfiguration
- 描述:错误的配置(如不安全的默认设置、过时的软件或未配置的安全功能),可能使应用程序面临攻击。
- 防御措施:定期审计和测试系统配置,使用自动化工具识别和修复配置问题。
-
Vulnerable and Outdated Components
- 描述:使用了具有已知漏洞或未及时更新的第三方库和组件,可能被攻击者利用。
- 防御措施:确保使用依赖管理工具(如Maven、npm),并定期更新组件,避免使用过时的版本。
-
Identification and Authentication Failures
- 描述:认证和身份验证流程中的缺陷,可能导致用户冒充、会话劫持等问题。
- 防御措施:实施强密码策略、使用多因素认证(MFA)和加固会话管理机制。
-
Software and Data Integrity Failures
- 描述:未能保证软件更新和数据的完整性,可能使攻击者篡改关键数据或上传恶意更新。
- 防御措施:使用签名机制来验证更新包的完整性,确保数据在传输和存储过程中的可靠性。
-
Security Logging and Monitoring Failures
- 描述:缺乏适当的日志记录和监控,无法有效检测、响应或追踪安全事件。
- 防御措施:实施集中化的日志记录、主动的监控和告警系统,确保能够及时发现并响应异常行为。
-
Server-Side Request Forgery (SSRF)
- 描述:攻击者通过伪造服务器端的请求来获取未授权的内部资源或数据,通常利用未受限制的服务器端请求机制。
- 防御措施:限制服务器端可以发起的请求范围,避免允许用户输入直接控制服务器端的请求参数。
重点风险与防御措施建议
-
Broken Access Control:最重要的防御措施是定期审查权限设计,确保每个用户只能访问必要的资源。建议结合应用的访问控制系统与自动化测试工具,确保权限配置不被篡改。
-
Cryptographic Failures:确保敏感数据加密和密钥管理机制符合行业标准,如使用硬件安全模块(HSM)来保护密钥。避免明文传输或存储敏感数据。
-
Injection:对于Web应用来说,防止注入攻击的最佳实践是始终使用参数化查询和预编译的语句。严禁直接拼接用户输入构建SQL或命令。
-
Security Misconfiguration:安全配置管理应作为持续改进的一部分,尤其是在引入新服务或更新系统时,保持自动化的安全配置审计机制至关重要。
-
SSRF:严格限制后端服务器能够访问的网络和资源,禁止对内部资源(如metadata或本地IP)发起请求。
导图
定义
文件上传漏洞是指Web应用允许用户上传文件,但没有对上传文件进行充分的验证和限制,导致攻击者可以上传恶意文件,如脚本、恶意代码等,进一步执行恶意操作。这种漏洞常见于文件管理、头像上传或文档管理等功能中。
攻击场景
文件上传漏洞有多种利用方式,攻击者可能会:
1. 上传恶意脚本
- 攻击者上传一个恶意文件(例如PHP、ASP、JSP等),然后通过URL直接访问该文件,导致服务器执行其中的恶意代码。这是最常见的文件上传利用方式,尤其是在Web服务器允许解析用户上传的文件时。
2. 目录遍历
- 攻击者可能通过上传文件并结合路径穿越漏洞,将文件保存到特定位置(例如Web可执行目录或系统目录),以进一步执行代码或操控服务器。
3. 覆盖现有文件
- 通过上传文件覆盖系统中的重要文件,攻击者可能篡改配置文件、脚本或数据库配置,导致服务瘫痪或安全性失效。
4. 文件上传结合社会工程攻击
- 攻击者上传看似无害的文件(如图像或PDF),诱骗其他用户下载并打开,实际包含恶意代码,导致用户系统感染恶意软件。
防御措施
为了防止文件上传漏洞,应采取多层次的防御措施:
1. 文件类型验证
- 验证上传文件的MIME类型和文件扩展名,确保只允许上传预期的文件类型。
- 然而,文件扩展名容易被伪装,应使用文件内容的签名(如Magic Number)进一步验证。
2. 文件名限制
- 对上传的文件名进行严格限制,禁止使用特殊字符和文件路径符号(如
../
),以防止路径穿越攻击。 - 文件名应进行随机化处理,防止攻击者通过猜测文件名进行操作。
3. 文件存储位置
- 上传的文件应存储在安全的目录之外,不能直接通过Web服务器访问。例如,上传目录应放置在Web根目录之外,避免通过URL直接访问。
- 如果必须存放在可访问的目录中,确保该目录不具有执行权限。
4. 文件权限设置
- 上传的文件应设置为只读权限,并禁止脚本执行。
- 利用操作系统的权限控制或设置Web服务器的目录权限来限制上传文件的访问范围。
5. 文件内容检测
- 对上传文件进行内容审查,避免恶意代码注入。可以使用杀毒软件或基于规则的扫描器检查上传文件的安全性。
6. 访问控制
- 限制文件上传功能仅供授权用户使用,并确保不同用户之间的文件操作隔离。
- 上传后验证用户身份,确保文件仅能被合法的用户访问或处理。
7. 服务器配置
- 在服务器配置层面禁用执行特定类型的文件(如PHP、JSP等),确保即使恶意脚本被上传,也无法被执行。
- 在Nginx或Apache中,可以通过设置
Content-Disposition
头将文件强制下载,而不是直接在浏览器中执行。
文件类型验证实现
Hutool的FileTypeUtil
Hutool是一个功能强大的Java工具库,提供了丰富的工具类,简化了许多常见的Java开发任务。FileTypeUtil
工具类能够根据文件的内容(Magic Number)自动判断文件类型,无需手动编写文件签名比对逻辑。
使用场景
通过Hutool的FileTypeUtil
,可以直接读取文件头部字节,判断文件的真实类型,防止攻击者伪装文件扩展名上传恶意文件。
Java代码实现:基于Hutool的Magic Number验证
package com.artisan.fileVunl;import cn.hutool.core.io.FileTypeUtil;
import java.io.File;
import java.io.IOException;
/*** @author 小工匠* @version 1.0* @date 2024/10/2 11:50* @mark: show me the code , change the world*/public class HutoolMagicNumberValidator {public static void main(String[] args) throws IOException {// 示例文件路径File file = new File("D:\\Blog\\006Xzox4gy1gdmmzfm2ioj303a03awem.jpg");// 调用Hutool的FileTypeUtil验证文件类型String fileType = FileTypeUtil.getType(file);if (isValidFileType(fileType)) {System.out.println("文件类型验证通过,文件类型是: " + fileType);} else {System.out.println("文件类型无效,上传被拒绝");}}/*** 根据文件类型判断是否为允许的类型*/private static boolean isValidFileType(String fileType) {// 允许的文件类型,如JPEG、PNG和PDFreturn "jpg".equals(fileType) || "png".equals(fileType) || "pdf".equals(fileType);}
}
详细说明
Hutool的FileTypeUtil工作原理
FileTypeUtil.getType(File file)
方法通过读取文件的前几个字节(文件头部的Magic Number),匹配Hutool库中已知的文件签名,然后返回文件的实际类型(如jpg
、png
、pdf
等)。
代码流程
- 读取文件:通过Hutool的
FileTypeUtil
读取文件内容,判断其实际类型。 - 验证文件类型:将文件类型与允许的类型列表进行比对,确保文件符合预期的类型。
- 输出验证结果:如果文件类型匹配,允许上传;否则,拒绝文件上传。
支持的文件类型
Hutool的FileTypeUtil
支持多种常见文件类型,包括图片、文档、视频等,适用于多种文件上传场景的安全防护。
防御措施分析
- 简化实现:Hutool封装了Magic Number验证逻辑,开发者无需手动维护文件签名列表,减少了代码复杂度。
- 扩展性强:Hutool支持多种常见文件类型,可以根据项目需求进行扩展,适应复杂的文件上传场景。
- 结合多层防御:在Magic Number验证基础上,依然可以结合文件扩展名和MIME类型的验证,提供多层次的防御。
文件上传防御流程
- 第一步:文件扩展名验证:确保上传文件的扩展名符合预期。
- 第二步:MIME类型验证:确保文件的MIME类型与扩展名和内容一致。
- 第三步:Magic Number验证:利用Hutool的
FileTypeUtil
进一步确认文件内容的真实性,避免伪造文件上传。
组合攻击
文件上传与路径穿越
- 如果文件上传功能存在路径穿越漏洞,攻击者可以通过操控上传路径,将恶意文件上传至特定目录(如Web根目录),从而直接通过URL访问并执行。
文件上传与代码注入
- 在文件上传漏洞中,如果攻击者可以上传动态脚本文件(如PHP),他们可以利用该文件直接注入代码并执行,例如通过浏览器直接访问
http://example.com/uploads/shell.php
。
文件上传与CSRF
- 文件上传功能如果缺乏适当的CSRF保护,攻击者可以诱导受害者提交恶意上传请求,从而在服务器上上传恶意文件。
漏洞Code演示与修复
存在文件上传漏洞的代码
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;public class FileUploadServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Part filePart = request.getPart("file"); // 获取上传的文件String fileName = filePart.getSubmittedFileName();// 存储文件到服务器的目录File file = new File("/var/www/uploads/" + fileName);filePart.write(file.getAbsolutePath());response.getWriter().println("File uploaded successfully");}
}
漏洞分析
- 没有验证文件类型和文件名,攻击者可以上传任意文件,如恶意脚本。
- 文件直接存储在Web目录下,可能被直接访问和执行。
修复示例
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;public class SafeFileUploadServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Part filePart = request.getPart("file");String fileName = filePart.getSubmittedFileName();// 1. 验证文件扩展名if (!fileName.endsWith(".jpg") && !fileName.endsWith(".png")) {response.getWriter().println("Invalid file type");return;}// 2. 生成随机文件名,避免文件覆盖和预测String safeFileName = System.currentTimeMillis() + "_" + fileName;// 3. 文件存储在Web目录之外File uploadDir = new File("/var/uploads/");if (!uploadDir.exists()) {uploadDir.mkdir();}File file = new File(uploadDir, safeFileName);filePart.write(file.getAbsolutePath());// 4. 设置文件权限为只读file.setReadable(true, true);file.setWritable(false, false);response.getWriter().println("File uploaded successfully");}
}
代码分析:
- 文件扩展名验证:只允许特定类型的文件(如
.jpg
、.png
)。 - 文件名随机化:使用时间戳生成唯一文件名,防止覆盖和预测。
- 文件存储在安全目录:避免直接存储在Web目录中,确保无法通过URL访问到文件。
- 权限设置:上传的文件被设置为只读,避免后续操作。
文件上传漏洞与其他常见漏洞的组合攻击
文件上传漏洞常常被攻击者用作攻击链中的一环。由于单一漏洞利用的效果可能有限,攻击者往往结合其他漏洞来扩大攻击影响范围,实现更高级的攻击目标。下面探讨几种常见的组合利用场景:
- 路径穿越结合文件上传:绕过文件上传目录限制,访问或执行敏感位置的文件。
- 远程代码执行(RCE)结合文件上传:通过上传并执行恶意文件实现远程控制。
- 跨站脚本(XSS)结合文件上传:通过文件传播恶意脚本,跨站点执行攻击。
- 跨站请求伪造(CSRF)结合文件上传:在不知情的情况下诱使用户上传恶意文件。
文件上传漏洞 + 路径穿越
攻击场景:绕过文件存储路径限制
在某些应用程序中,即使存在文件上传功能,文件通常会被限制在特定目录下,如/uploads
,无法直接上传到服务器的关键目录。然而,结合路径穿越漏洞,攻击者可以通过构造恶意的文件路径来绕过这些限制,上传文件到敏感目录并执行恶意代码。
高级利用步骤
- 上传构造路径文件:攻击者上传文件时,在文件名中使用路径穿越符号,例如
../../../../var/www/html/shell.php
,尝试绕过目录限制。 - 利用路径穿越漏洞:服务器没有正确处理文件名或路径,导致文件实际存储在
/var/www/html/
目录中。 - 执行上传文件:通过URL直接访问
http://example.com/shell.php
,执行上传的PHP文件,从而进行远程代码执行。
防御措施
- 严格验证文件路径,使用
getCanonicalPath()
检查文件的真实路径,防止路径穿越。 - 限制上传目录,并确保该目录无执行权限。
文件上传漏洞 + 远程代码执行(RCE)漏洞
攻击场景:利用脚本文件上传实现RCE
最具破坏性的攻击之一是上传恶意脚本文件(如PHP、ASP或JSP文件),并通过直接访问这些文件来执行远程代码。文件上传漏洞允许上传任意类型的文件,而Web服务器将这些文件存储在可被Web访问的目录中,导致攻击者可以通过URL直接访问并执行这些文件。
高级利用步骤
- 上传恶意脚本文件:攻击者上传一个恶意的PHP脚本,如
<?php system($_GET['cmd']); ?>
,并将其存储在可访问的Web目录中。 - 触发代码执行:攻击者通过浏览器访问恶意文件并通过URL传递命令参数,如
http://example.com/uploads/shell.php?cmd=whoami
。 - 获得服务器控制权:攻击者可以执行任何命令,获取服务器的敏感信息或进一步传播攻击。
防御措施
- 禁止可执行脚本类型的文件上传,尤其是像
.php
、.jsp
、.exe
等危险文件。 - 将上传目录设置为不可执行,防止服务器执行上传的文件。
- 使用应用层的WAF(Web Application Firewall)过滤异常的请求模式。
文件上传漏洞 + 跨站脚本(XSS)
攻击场景:通过文件上传传播XSS攻击
攻击者可以通过上传包含恶意JavaScript代码的文件来进行XSS攻击。例如,攻击者上传一个包含恶意脚本的HTML文件或图片(通过伪装的文件名),并诱导其他用户访问该文件。浏览器解析这些文件时,可能执行其中的JavaScript代码,从而危害其他用户。
利用步骤
- 上传含有恶意脚本的文件:例如,攻击者上传一个伪装成图片的HTML文件,其中嵌入了恶意JavaScript,如
<script>alert('XSS');</script>
。 - 诱导用户访问文件:攻击者通过诱骗手段,诱导其他用户访问此恶意文件的URL。
- 脚本执行:浏览器执行恶意JavaScript代码,导致用户的会话劫持、数据泄露或其他操作。
防御措施
- 对上传文件的MIME类型进行严格校验,并使用内容检查工具确保文件的合法性。
- 对上传文件名及其内容进行HTML转义,防止浏览器错误地解析文件中的恶意代码。
文件上传漏洞 + CSRF
攻击场景:利用CSRF强制上传恶意文件
跨站请求伪造(CSRF)攻击可以通过诱导用户在不知情的情况下上传恶意文件。例如,攻击者构造一个恶意链接或表单,诱骗受害者在登录状态下访问,从而自动触发文件上传请求,将恶意文件上传到服务器。
利用步骤
- 构造恶意表单:攻击者创建一个隐藏的表单,包含文件上传功能,并预置恶意文件(通过URL传递或base64编码等方式)。
- 诱导受害者点击:受害者在登录的情况下点击恶意链接或提交表单,不知不觉中上传恶意文件。
- 攻击者执行恶意文件:恶意文件被成功上传到服务器后,攻击者可以通过直接访问该文件进行进一步攻击。
防御措施
- 为上传功能添加CSRF Token验证,确保上传请求只能由合法用户发起。
- 限制文件上传功能的访问权限,只有经过授权的用户才能上传文件。
- 结合验证码机制,确保用户交互的真实性,防止自动化攻击。
组合漏洞Code : 路径穿越与远程代码执行(RCE)
场景介绍
攻击场景:路径穿越与远程代码执行(RCE)的结合利用
攻击者上传恶意脚本文件(如PHP、JSP)并通过路径穿越漏洞将文件存放到Web服务器的可执行目录下,随后通过URL访问该恶意文件,实现远程代码执行,从而获得服务器控制权。
问题代码
这是一个存在文件上传漏洞与路径穿越漏洞的示例代码,展示了如何利用这些漏洞进行攻击。
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;@MultipartConfig
public class VulnerableFileUploadServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取上传文件的部分Part filePart = request.getPart("file");String fileName = filePart.getSubmittedFileName();// 路径穿越漏洞,攻击者可以通过文件名控制文件存储路径String uploadPath = "/var/www/uploads/" + fileName;// 将文件写入指定路径filePart.write(uploadPath);response.getWriter().println("File uploaded successfully to: " + uploadPath);}
}
漏洞分析
- 路径穿越漏洞:
fileName
来自用户的输入,未经过滤和验证,攻击者可以构造诸如../../webapps/ROOT/shell.jsp
的文件名,从而将文件写入服务器的Web目录中。 - 远程代码执行漏洞:上传恶意脚本文件后,攻击者可以通过URL直接访问该文件,从而执行恶意代码,例如
http://example.com/shell.jsp
。
利用步骤
-
上传恶意文件:攻击者上传一个JSP文件(如
shell.jsp
),内容为:<%@ page import="java.io.*" %> <%String cmd = request.getParameter("cmd");Process p = Runtime.getRuntime().exec(cmd);OutputStream os = p.getOutputStream();InputStream in = p.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(in));String line = null;while ((line = reader.readLine()) != null) {out.println(line);} %>
-
路径穿越:上传的文件名为
../../webapps/ROOT/shell.jsp
,将文件存储到Tomcat服务器的Web可执行目录中。 -
远程执行命令:攻击者通过浏览器访问
http://example.com/shell.jsp?cmd=whoami
,远程执行命令并获得服务器权限。
防御措施
为了防止上述路径穿越与RCE漏洞,需要对代码进行修复和增强安全性:
修复代码
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;@MultipartConfig
public class SecureFileUploadServlet extends HttpServlet {private static final String UPLOAD_DIR = "/var/uploads/";@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取上传的文件部分Part filePart = request.getPart("file");String fileName = filePart.getSubmittedFileName();// 1. 验证文件名,防止路径穿越if (fileName.contains("..") || fileName.contains("/") || fileName.contains("\\")) {response.getWriter().println("Invalid file name.");return;}// 2. 验证文件类型,防止上传恶意脚本String mimeType = getServletContext().getMimeType(fileName);if (!isAllowedFileType(mimeType)) {response.getWriter().println("Invalid file type.");return;}// 3. 生成安全的文件名,避免文件名冲突和预测String safeFileName = System.currentTimeMillis() + "_" + fileName;// 4. 使用安全路径,将文件存储在不可执行的目录中Path uploadPath = Paths.get(UPLOAD_DIR + safeFileName);// 确保上传目录存在if (!Files.exists(uploadPath.getParent())) {Files.createDirectories(uploadPath.getParent());}// 将文件写入磁盘filePart.write(uploadPath.toString());response.getWriter().println("File uploaded successfully to: " + uploadPath);}private boolean isAllowedFileType(String mimeType) {return mimeType.equals("image/jpeg") || mimeType.equals("image/png") || mimeType.equals("application/pdf");}
}
防御措施分析
- 验证文件名:代码检查文件名是否包含路径穿越符号(如
..
),避免文件被上传到非预期目录。 - 文件类型验证:通过检查文件的MIME类型,确保只允许上传预期的文件类型,如图片或PDF,防止上传脚本文件。
- 文件名随机化:使用时间戳生成唯一文件名,避免文件覆盖和文件名预测攻击。
- 安全目录存储:将上传文件存储在不可执行的目录中,防止上传文件被直接执行。
- 限制文件访问:配置Web服务器禁止访问上传目录中的文件,或将上传目录存储在Web根目录之外。
详细说明
攻击原理
- 路径穿越攻击:攻击者通过上传带有路径穿越符号的文件名(如
../../webapps/ROOT/shell.jsp
),将文件上传到服务器可执行目录中,从而获得远程执行权限。 - 远程代码执行(RCE):上传的恶意文件是可执行脚本(如JSP),攻击者可以通过浏览器远程访问该文件并执行任意命令。
防御机制
- 路径验证:通过检查文件名和路径,避免攻击者操控文件存储位置。
- 文件类型限制:通过限制上传的文件类型,防止攻击者上传脚本文件。
- 安全的文件存储:将上传文件存储在Web根目录之外,确保上传文件不会被直接访问和执行。
- 文件权限设置:确保上传的文件目录没有执行权限,限制潜在的恶意操作。