Web安全 - 文件上传漏洞(File Upload Vulnerability)
文章目录
- 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根目录之外,确保上传文件不会被直接访问和执行。
- 文件权限设置:确保上传的文件目录没有执行权限,限制潜在的恶意操作。
相关文章:
Web安全 - 文件上传漏洞(File Upload Vulnerability)
文章目录 OWASP 2023 TOP 10导图定义攻击场景1. 上传恶意脚本2. 目录遍历3. 覆盖现有文件4. 文件上传结合社会工程攻击 防御措施1. 文件类型验证2. 文件名限制3. 文件存储位置4. 文件权限设置5. 文件内容检测6. 访问控制7. 服务器配置 文件类型验证实现Hutool的FileTypeUtil使用…...
vue3中el-input在form表单按下回车刷新页面
摘要: 在input框中点击回车之后不是调用我写的回车事件,而是刷新页面! 如果表单中只有一个input 框则按下回车会直接关闭表单 所以导致刷新页面 再写一个input 表单 ,并设置style“display:none” <ElInput style"display…...
SQL Server中关于个性化需求批量删除表的做法
在实际开发中,我们常常会遇到需要批量删除表,且具有共同特征的情况,例如:找出表名中数字结尾的表之类的,本文我将以3中类似情况为例,来示范并解说此类需求如何完成: 第一种,批量删除…...
关于按键状态机解决Delay给程序带来的问题
问题产生 我在学习中断的过程中,使用EXTI15外部中断,在其中加入HAL_Delay();就会发生报错 错误地方 其它地方配置 问题原因 在中断服务例程(ISR)中使用 HAL_Delay() 会导致问题的原因是: 阻塞性: HAL_D…...
62.【C语言】浮点数的存储
目录 1.浮点数的类型 2.浮点数表示的范围 3.浮点数的特性 《计算机科学导论》的叙述 4.浮点数在内存中的存储 答案速查 分析 前置知识:浮点数的存储规则 推导单精度浮点数5.5在内存中的存储 验证 浮点数取出的分析 1.一般情况:E不全为0或不全为1 2.特殊情况:E全为0…...
GO网络编程(一):基础知识
1. 网络编程的基础概念 TCP/IP 协议栈 TCP/IP 是互联网通信的核心协议栈,分为以下四个层次: 应用层(Application Layer):为应用程序提供网络服务的协议,比如 HTTP、FTP、SMTP 等。传输层(Tra…...
【Linux】用虚拟机配置Ubuntu环境
目录 1.虚拟机安装Ubuntu系统 2.Ubuntu系统的网络配置 3.特别声明 首先我们先要下载VMware软件,大家自己去下啊! 1.虚拟机安装Ubuntu系统 我们进去之后点击创建新的虚拟机,然后选择自定义 接着点下一步 再点下一步 进入这个界面之后&…...
酒店智能门锁SDK接口pro[V10] 门锁校验C#-SAAS本地化-未来之窗行业应用跨平台架构
一、代码 int 酒店标识_int Convert.ToInt32(酒店标识);StringBuilder 锁号2024 new StringBuilder(8);//信息 "未知返回值:" bufCard_原始;GetGuestLockNoByCardDataStr_原始(酒店标识_int, bufCard_原始.ToString(), 锁号2024);StringBuilder 退…...
Gitのrebase用法
在 Git 中,rebase 是一种用于整合多个提交历史的操作,它可以将一个分支的变更“重放”到另一个分支上。与 merge 不同,rebase 会产生一个线性的提交历史,使得项目的历史记录更加整洁和易于理解。 1. 什么是 Rebase? …...
二分查找一>:在排序数组中查找元素的第一个和最后一个位置
1.题目: 2.解析:这里不能用传统二分,因为涉及范围,传统二分时间复杂度会降为O(N),要做些改动。 步骤一:查找区间左端点 细节图: 步骤二:查找区间右端点: 细节图: 代码…...
undeclared identifier ‘UNITY_PREV_MATRIX_M‘ - Unity Shader自己写URP,引用内部 hlsl
碰到这样的问题,居然非常淡定 这个链接里说了问题: 一个哥们A问,为什么include urp common.hlsl 提示莫名其妙 另一个哥们B说,这个issue 说了,可能是这个原因(也没正面答) 从issue我们知道&a…...
信息安全工程师(29)存储介质安全分析与防护
前言 存储介质安全分析与防护是确保数据安全与完整性的重要环节。存储介质,如硬盘、U盘、SD卡等,作为数据的载体,其安全性直接关系到数据的安全。 一、存储介质安全分析 1. 数据泄露风险 格式化不彻底:传统的格式化操作往往只能删…...
Html5知识点介绍
HTML5 是 HTML 的最新版本,它引入了许多新特性和元素来增强 Web 开发的能力和灵活性。以下是一些关键的 HTML5 知识点: 1. 语义化标签 HTML5 增加了许多新的语义化标签,用来更好地定义页面结构和内容,这些标签使代码更加清晰易读&…...
探索机器学习中的特征选择技术
在机器学习和数据科学领域,特征选择是一个关键步骤,它不仅有助于提高模型的性能,还能帮助我们更好地理解数据。本文将深入探讨特征选择的重要性、常见方法以及如何在实际项目中应用这些技术。 一、特征选择的重要性 降低维度:减…...
数造科技入选中国信通院《高质量数字化转型产品及服务全景图》三大板块
9月24日,2024大模型数字生态发展大会暨“铸基计划”年中会议在北京召开。会上,中国信通院发布了2024年《高质量数字化转型产品及服务全景图(上半年度)》和《高质量数字化转型技术解决方案(上半年度)》等多项…...
什么是分布式数据库
分布式数据库(Distributed Database)是一种数据库系统,它的数据被存储在不同的物理位置,但对用户来说表现得就像一个单一的、统一的数据库。这种系统由多个自治的数据库站点组成,这些站点通过网络相互连接,…...
从u盘直接删除的文件能找回吗 U盘文件误删除如何恢复
U盘上的文件被删除并不意味着它们立即消失。事实上,删除操作只是将文件从文件系统的目录中移除,并标记可用空间。这意味着在文件被覆盖之前,它们仍然存在于存储介质上。因此,只要文件没有被新的数据覆盖,我们就有机会恢…...
如何使用ssm实现基于HTML的中国传统面食介绍网站的搭建+vue
TOC ssm758基于HTML的中国传统面食介绍网站的搭建vue 第1章 绪论 1.1选题动因 当前的网络技术,软件技术等都具备成熟的理论基础,市场上也出现各种技术开发的软件,这些软件都被用于各个领域,包括生活和工作的领域。随着电脑和笔…...
【生成模型】学习笔记
生成模型 生成模型概述(通俗解释) 生成的核心是生成抽象化的内容,利用已有的内容生成没有的/现实未发生的内容。这个过程类似于人类发挥想象力的过程。 生成模型的应用场景非常广泛,可以应用于艺术表达,如画的生成、…...
大语言模型知识点分享
1 目前主流的开源模型体系有哪些? Prefix Decoder 系列模型 核心点: 输入采用双向注意力机制,输出为单向注意力。双向注意力意味着输入的每个部分都可以关注到输入的所有其他部分,这在理解上下文时具有很强的优势。 代表模型&a…...
openpnp - 底部相机高级校正的参数设置
文章目录 openpnp - 底部相机高级校正的参数设置概述笔记修改 “Radial Lines Per Calibration Z” 的方法不同 “Radial Lines Per Calibration Z”的校验结果不同 “Radial Lines Per Calibration Z”的设备校验动作的比较总结备注END openpnp - 底部相机高级校正的参数设置 …...
劳动与科技、艺术结合更好提高劳动教育意义
在中小学教育中,劳动教育是培养学生基本生活技能和劳动习惯的重要环节。但当代的劳动教育不在单纯的劳动,而是劳动技能的提升与学习,通过学习劳动技能与实践活动,强化劳动教育与其他课程的融合,学生深刻理解劳动的意义…...
基于Hive和Hadoop的招聘分析系统
本项目是一个基于大数据技术的招聘分析系统,旨在为用户提供全面的招聘信息和深入的职位市场分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出,以 Spark 为核…...
目标检测评价指标
混淆矩阵(Confusion Matrix) 准确率(accuracy) 准确率:预测正确的样本数 / 样本数总数 (正对角线 / 所有) 精度(precision) 精度:预测正确里面有多少确实是…...
解决VRM格式模型在Unity中运行出现头发乱飞等问题
1、问题 通过VRoidStudio制作导出的vrm格式的模型,放在unity中使用时,一运行就会出现头发乱飞,没有自然下垂的问题 2、解决方法 将模型下的secondary中的所有VRM Spring Bone脚本中的Drag Force改为1,Hit Radius改为0 修改后…...
消息中间件---初识(Kafka、RocketMQ、RabbitMQ、ActiveMQ、Redis)
1. 简介 消息中间件是一种支撑性软件系统,它在网络环境中为应用系统提供同步或异步、可靠的消息传输。消息中间件利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。它支持多种通信协议和数据格式,…...
MySQL高阶2010-职员招聘人数2
目录 题目 准备数据 分析数据 总结 题目 一家公司想雇佣新员工。公司的工资预算是 $70000 。公司的招聘标准是: 继续雇佣薪水最低的高级职员,直到你不能再雇佣更多的高级职员。用剩下的预算雇佣薪水最低的初级职员。继续以最低的工资雇佣初级职员&…...
【Java】—— 集合框架:Collection接口中的方法与迭代器(Iterator)
目录 1. 集合框架概述 1.1 生活中的容器 1.2 数组的特点与弊端 1.3 Java集合框架体系 1.4 集合的使用场景 2. Collection接口及方法 2.1 添加 2.2 判断 2.3 删除 2.4 其它 3. Iterator(迭代器)接口 3.1 Iterator接口 3.2 迭代器的执行原理 3.3 foreach循环 1. 集…...
华证ESG工具变量(2009-2022年)
华证ESG工具变量包括以下十个关键指标: 同年份同行业的ESG均值(mean1):在同一年份和相同行业中,所有企业的ESG表现平均值。 同年份同省份的ESG均值(mean2):在同一年份和相同省份中&…...
Linux date命令(用于显示和设置系统的日期和时间,不仅可以显示时间,还能进行复杂的时间计算和格式化)
文章目录 深入探讨 Linux Date 命令1. Date 命令详细功能解析1.1 命令概述1.2 命令语法 2. 时间显示与格式化2.1 标准时间输出2.2 自定义格式输出 3. 设置系统日期和时间3.1 基本用法3.2 注意事项 4. 实用示例与脚本应用4.1 生成时间戳秒级时间戳毫秒时间戳 4.2 时间戳转换4.3 …...
公司注册好了怎么做网站/sem扫描电子显微镜
1. Redis的发布和订阅 1.1. 什么是发布和订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。 Redis 客户端可以订阅任意数量的频道。 1.2. Redis的发布和订阅 1、客户端可以订阅频道如下图 2、当给…...
网站建设 中企动力阀门/地推怎么做最有效
问题描述 试题编号:201509-4试题名称:高速公路时间限制:1.0s内存限制:256.0MB问题描述: 问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路&#…...
珠海网站建设科技公司/济南seo排行榜
我们在工作中或多或少都使用过线程池,但是为什么要使用线程池呢?从他的名字中我们就应该知道,线程池使用了一种池化技术,和很多其他池化技术一样,都是为了更高效的利用资源,例如链接池,内存池等…...
网站开发用到的编程/推广小程序
wsyttwt衣服淘宝店链接:http://shop35460385.taobao.com来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/39335/viewspace-350709/,如需转载,请注明出处,否则将追究法律责任。 转载于:http://blog.itpub.net/39335…...
wordpress 4.8 en us/webview播放视频
jvm先装载类,再链接类,再初始化类(以代码的文本顺序执行类变量初始化器、类静态初始化方法或接口的属性(field)初始化器),完成类的初始化后,才执行类的main方法。在链接过程中&#…...
国内优秀的响应式网站/怎么接app推广的单子
1.事件流: (1)事件捕获 (2)处于目标阶段 (3)事件冒泡 2.事件对象 对每一个事件都会回调函数,会有一个默认的事件对象,就是this event.target 触发的目标对象 event.type 事件类型 event.keyCode 键码 3.事件冒泡 event.stopPropagation() 阻止冒泡 event.preventDefault() 阻止…...