当前位置: 首页 > news >正文

《白帽子讲 Web 安全》之文件操作安全

目录

引言

(一)文件上传与下载漏洞概述

1.文件上传的常见安全隐患

1.1前端校验的脆弱性与服务端脚本执行危机在文件上传流程中,部分开发者可能会在前端使用 JavaScript 代码对文件后缀名进行简单校验,试图以此阻止非法文件上传。但这种做法存在严重缺陷,因为前端代码在用户浏览器端运行,攻击者可轻易通过浏览器开发者工具或其他手段修改前端代码,绕过此类校验。

1.2基于 Content-Type 判断文件类型的不可靠性

1.3恶意构造畸形文件的威胁

1.4上传网页文件的风险

1.5服务端缺乏安全检查与内容检验

1.6可预测的文件存储路径与未授权访问

1.7Web 服务器 PUT 方法的潜在风险

 1.8Windows 系统 NTFS 文件系统的安全隐患

 1.9上传压缩包的安全风险

2.文件下载的安全隐患

2.1路径解析漏洞

2.2路径穿越攻击与任意文件读取漏洞

2.3Nginx 配置不正确造成的路径穿越漏洞

(二)文件上传与下载的安全策略

1.文件上传安全

1.1 文件路径信息的安全

漏洞利用方式

防御措施

1.2 文件内容的安全

漏洞利用方式

防御措施

2.文件包含漏洞

2.1本地文件包含与远程文件包含

本地文件包含

远程文件包含

漏洞利用方式

防御措施

2.2用文件包含实现拒绝服务攻击

漏洞利用方式

防御措施

3.文件上传安全策略

3.1路径信息的安全考虑

3.2文件内容的安全考虑

4.文件下载安全

4.1路径信息的安全考虑

4.2文件内容的安全考虑

(三)对象存储的安全问题

总结


引言

在当今数字化时代,Web 应用已成为人们生活和工作中不可或缺的一部分。从日常的社交分享、在线购物,到复杂的企业业务处理,Web 应用承担着海量的数据交互任务。而文件操作,作为 Web 应用中频繁涉及的功能,无论是文件上传以丰富内容,还是文件下载以获取资源,其重要性不言而喻。然而,如同硬币的两面,文件操作在带来便利的同时,也潜藏着诸多安全风险。

文件操作是 Web 应用中最常见的功能之一,无论是文件上传、下载,还是文件处理,都与用户的日常操作密切相关。然而,这一看似简单的功能模块却是 Web 安全中的高危地带。攻击者常常通过文件操作漏洞,绕过服务器的安全机制,实现对服务器的控制、敏感信息的窃取甚至网站的完全接管。

《白帽子讲 Web 安全》一书中,吴翰清和叶敏对文件操作的安全问题进行了系统化的分析,从文件上传、下载到文件包含、路径穿越等常见漏洞,逐一剖析其原理、利用方式及防御策略。本文将结合书中的内容,对这一章节进行全面总结,力求通过详细的讲解和实际案例,帮助读者深入理解文件操作中的安全风险,并掌握相应的防护措施。


(一)文件上传与下载漏洞概述

1.文件上传的常见安全隐患

1.1前端校验的脆弱性与服务端脚本执行危机
在文件上传流程中,部分开发者可能会在前端使用 JavaScript 代码对文件后缀名进行简单校验,试图以此阻止非法文件上传。但这种做法存在严重缺陷,因为前端代码在用户浏览器端运行,攻击者可轻易通过浏览器开发者工具或其他手段修改前端代码,绕过此类校验。

例如,攻击者想要上传一个恶意的 PHP 脚本文件,正常情况下前端校验会阻止.php后缀文件上传,但攻击者只需修改校验函数逻辑,就能顺利上传该文件。更为严峻的是,许多 Web 脚本语言,如 PHP、ASP 等,当服务器接收到上传文件后,若文件后缀名符合可执行脚本类型,且服务器配置允许,就会自动执行该文件中的代码。一旦恶意脚本文件被执行,攻击者便能肆意控制服务器,执行诸如窃取敏感数据(如用户信息、数据库凭证)、篡改网站页面内容、植入后门程序等恶意操作。

上传文件时 Web 脚本被服务器执行

文件上传漏洞的核心问题是上传的文件被服务器当作可执行脚本运行。攻击者通常会上传包含恶意代码的文件(如 .php.jsp 等),并通过访问这些文件来触发代码执行。

漏洞利用方式

  • 伪装文件类型:攻击者可能会将恶意脚本文件的后缀名伪装成常见的图片格式(如 .php.jpg ),利用服务器对文件后缀名的简单验证。

  • 利用 Content-Type 信任机制:某些服务器仅根据文件的 Content-Type 头来判断文件类型,而忽略了文件的实际内容。

漏洞的危害

  • 服务器控制:攻击者可以通过上传的脚本文件执行任意命令,控制服务器。

  • 敏感信息泄露:恶意脚本可能读取服务器的配置文件、数据库信息等敏感数据。

防御措施

  • 严格的文件类型检查:不仅检查文件后缀名,还要检查文件的魔数(文件头信息)以确保文件类型真实。

  • 限制文件上传目录的权限:确保上传目录没有执行脚本的权限。

  • 使用白名单机制:只允许上传特定的文件类型。


1.2基于 Content-Type 判断文件类型的不可靠性


有些服务端在判断上传文件类型时,仅依赖 HTTP 请求头中的 Content-Type 字段。然而,Content-Type 极易被伪造。

例如,攻击者将一个精心构造的恶意可执行文件(如.exe文件)伪装成常见的图片文件(如.jpg)。在构造 HTTP 请求时,通过工具将请求头中的 Content-Type 字段设置为image/jpeg,服务端仅依据此判断,便可能将其误判为合法图片文件,从而允许上传。这种简单的文件类型判断方式,在面对有一定技术能力的攻击者时,几乎毫无防御能力,为恶意文件上传大开方便之门。


1.3恶意构造畸形文件的威胁


攻击者可精心构造畸形文件,以此攻击服务端。这些畸形文件不符合正常文件格式规范,却能利用服务端文件处理程序或相关库的漏洞。以图像处理库为例,当服务端使用某些图像处理库处理图片文件时,若攻击者上传一个经过特殊构造的畸形图片文件,该库在解析文件结构时可能会出现内存溢出漏洞。攻击者利用此漏洞,可执行任意代码,获取服务器控制权;或者通过不断上传此类畸形文件,消耗大量服务器资源,如 CPU、内存等,导致服务器瘫痪,形成拒绝服务攻击(DoS),使正常用户无法访问网站服务。

恶意构造畸形文件威胁服务端

攻击者可能会构造畸形文件(如损坏的图片文件或包含恶意代码的压缩包),利用服务器对文件的处理逻辑,消耗服务端的资源或触发服务器崩溃。

漏洞利用方式

  • 构造异常大的文件:上传超大文件,占用服务器存储空间或带宽。

  • 利用文件处理库漏洞:某些图片处理库(如 GD 库)可能存在缓冲区溢出漏洞,攻击者通过上传特定格式的文件触发漏洞。

漏洞的危害

  • 服务不可用:攻击可能导致服务器资源耗尽,无法正常提供服务。

  • 数据丢失:文件处理过程中的漏洞可能破坏服务器上的重要数据。

防御措施

  • 限制文件大小:设置合理的文件上传大小限制。

  • 使用安全的文件处理库:定期更新文件处理库,修复已知漏洞。

  • 监控服务器资源:实时监控服务器的 CPU、内存、磁盘使用情况,及时发现异常。


1.4上传网页文件的风险


若 Web 应用允许用户上传网页文件,这将为攻击者提供实施钓鱼攻击和跨站脚本(XSS)攻击的绝佳机会。攻击者可上传一个模仿知名网站登录页面的恶意网页,当其他用户访问该网页时,误以为是正常网站,输入账号密码等敏感信息,攻击者便能轻松窃取这些信息。

在跨站脚本攻击方面,攻击者在上传的网页文件中嵌入恶意 JavaScript 脚本,当其他用户浏览该网页时,脚本在用户浏览器中执行,可获取用户的 Cookie、会话令牌等关键信息。利用这些信息,攻击者能劫持用户会话,以用户身份在网站上进行各种操作,如转账、修改用户资料等,严重侵犯用户权益。

 允许上传网页威胁用户

攻击者可能会上传包含恶意代码的网页文件(如 .html.js 等),通过诱导用户访问这些文件,实施钓鱼攻击或 XSS 攻击。

漏洞利用方式

  • 钓鱼攻击:上传伪造的登录页面,诱导用户提供账号密码。

  • XSS 攻击:上传包含恶意脚本的网页文件,通过其他用户访问时触发 XSS 攻击。

漏洞的危害

  • 用户信息泄露:攻击者可能窃取用户的敏感信息。

  • 传播恶意代码:通过上传的网页文件传播病毒或木马。

防御措施

  • 禁止上传网页文件:限制上传文件类型,避免允许上传 .html.js 等文件。

  • 对上传内容进行扫描:使用病毒扫描工具或代码扫描工具,检测上传文件中是否存在恶意代码。


1.5服务端缺乏安全检查与内容检验


若服务端在文件上传过程中未进行严格的安全检查和内容检验,就如同敞开大门,任由恶意文件长驱直入。攻击者可上传各类恶意文件,如病毒文件、蠕虫文件、木马文件等。这些文件一旦在服务器上传播,或被其他用户下载,将造成严重后果。

例如,恶意文件可能感染服务器上的其他文件,破坏数据完整性,导致业务数据丢失;或者通过服务器进一步传播到其他用户的设备上,感染用户设备,窃取用户隐私信息,控制用户设备进行恶意活动,如发起分布式拒绝服务攻击(DDoS)等。

 服务端未对文件做安全检查或内容检验

攻击者可能会上传包含敏感信息或恶意代码的文件,而服务器未能对其进行有效的安全检查。

漏洞利用方式

  • 上传敏感信息:攻击者上传包含服务器配置、数据库密码等敏感信息的文件。

  • 上传恶意代码:攻击者上传包含后门程序或蠕虫病毒的文件。

漏洞的危害

  • 数据泄露:服务器的重要数据可能被窃取。

  • 系统被控制:恶意代码可能被用来控制服务器或发起进一步攻击。

防御措施

  • 内容扫描:对上传的文件进行内容扫描,检测是否存在恶意代码或敏感信息。

  • 使用沙盒环境:对上传的文件进行隔离处理,避免直接在生产环境中运行。


1.6可预测的文件存储路径与未授权访问


在一些 Web 应用中,文件存储路径的生成规则较为简单,易于被攻击者预测。

例如,部分应用可能按照用户 ID 和时间戳的组合来生成文件存储路径,如/uploads/user_{user_id}/{timestamp}/file.ext。攻击者通过枚举或猜测用户 ID 和时间戳,就能尝试访问其他用户上传的文件。若此时应用未对文件访问采取严格的授权措施,攻击者便能直接访问这些文件,获取用户的敏感信息,如个人照片、重要文档等,侵犯用户隐私,也可能对应用的声誉造成负面影响。

上传的文件存储路径可以预测且未采取授权措施

攻击者可能通过猜测文件的存储路径,直接访问其他用户的文件,导致敏感信息泄露。

漏洞利用方式

  • 路径猜测:攻击者通过尝试不同的路径,访问未授权的文件。

  • 暴力破解:攻击者通过暴力破解的方式,猜测文件的存储路径。

漏洞的危害

  • 敏感信息泄露:攻击者可能获取用户的私人文件,如照片、文档等。

  • 数据完整性破坏:攻击者可能删除或篡改其他用户的文件。

防御措施

  • 随机化文件名:上传文件时,使用随机的文件名,避免路径被猜测。

  • 访问控制:对文件的访问进行严格的权限控制,确保只有授权用户才能访问。


1.7Web 服务器 PUT 方法的潜在风险


当 Web 服务器支持 PUT 方法,且配置不当时,攻击者可利用该方法上传任意文件到服务器的任意位置。PUT 方法原本用于向服务器上传文件,但如果服务器未对上传路径和文件类型进行有效限制,攻击者可将恶意脚本文件上传到 Web 服务器的根目录或其他关键目录。

例如,攻击者将一个恶意的 WebShell 文件(如evil.php)上传到 Web 服务器的根目录,随后通过浏览器访问该文件,便能获取服务器的控制权,执行任意命令,对服务器进行全面攻击,包括篡改网站内容、窃取数据、安装恶意软件等。

 Web 服务器支持 PUT 方法造成重大问题

某些 Web 服务器默认支持 PUT 方法,攻击者可以利用这一点上传恶意文件,绕过传统的文件上传接口。

漏洞利用方式

  • 直接上传文件:攻击者通过 PUT 请求直接向服务器上传恶意文件。

  • 覆盖已有文件:攻击者可能上传同名文件,覆盖服务器上的重要文件。

漏洞的危害

  • 服务器被控制:攻击者上传的恶意文件可能包含后门程序,控制服务器。

  • 数据丢失:攻击者可能覆盖重要的配置文件或数据库文件。

防御措施

  • 禁用 PUT 方法:在服务器配置中,关闭 PUT 方法的支持。

  • 限制文件上传路径:即使允许 PUT 方法,也要限制文件上传的路径。


 1.8Windows 系统 NTFS 文件系统的安全隐患


Windows 系统的 NTFS 文件系统具备可选数据流(ADS)特性,这一特性在正常情况下为文件管理提供了一定便利,但也被攻击者利用来实施恶意行为。攻击者可将恶意代码隐藏在正常文件的可选数据流中。

例如,攻击者将一个恶意的可执行文件(如backdoor.exe)隐藏在一个看似正常的图片文件(如image.jpg)的可选数据流中。当应用程序在处理该图片文件时,由于对可选数据流的处理不当,可能会意外执行隐藏在其中的恶意代码。攻击者借此实现其预期外功能,如在用户设备上植入后门程序,远程控制用户设备,窃取用户信息等,且这种攻击方式具有很强的隐蔽性,不易被发现。

 Windows 系统利用 NTFS 文件系统的可选数据库

Windows 系统的 NTFS 文件系统支持可选数据库(Alternate Data Streams,ADS),攻击者可以利用这一特性隐藏恶意代码。

漏洞利用方式

  • 隐藏恶意代码:攻击者将恶意代码存储在 ADS 中,绕过服务器的文件类型检查。

  • 伪装文件类型:攻击者可以将恶意文件伪装成常见的文件类型,如 .doc.xls 等。

漏洞的危害

  • 恶意代码隐藏:攻击者可以通过 ADS 隐藏恶意代码,规避传统的安全检测。

  • 文件解析问题:某些应用程序可能错误地解析包含 ADS 的文件,导致意外行为。

防御措施

  • 禁用 ADS 支持:在服务器上禁用 NTFS 的 ADS 功能。

  • 文件解析控制:对文件的解析过程进行严格的控制,避免解析包含 ADS 的文件。


 1.9上传压缩包的安全风险


在允许上传压缩包的 Web 应用场景中,如果应用在解压和读取压缩包内容时未进行严格安全检查,攻击者可通过上传包含恶意文件的压缩包突破安全防线。攻击者可在压缩包中放置恶意脚本文件,如evil.php,当 Web 应用解压该压缩包并尝试执行其中的脚本文件时,攻击者便能获取服务器控制权。或者放置畸形文件,利用解压程序的漏洞发起攻击。此外,攻击者还可在压缩包中构造具有特殊路径的文件,如../../../sensitive.txt,当 Web 应用解压时,可能导致路径穿越攻击,访问到服务器上本不应被访问的敏感文件。

允许上传压缩包的场景

攻击者可能会上传包含恶意文件的压缩包,服务器在解压时可能执行恶意代码。

漏洞利用方式

  • 上传恶意压缩包:攻击者上传包含恶意脚本的压缩包文件(如 .zip.rar 等)。

  • 触发解压:攻击者通过某种方式触发服务器对压缩包的解压操作,从而执行恶意代码。

漏洞的危害

  • 服务器被控制:攻击者上传的恶意脚本可能被服务器执行,控制服务器。

  • 数据泄露:恶意脚本可能窃取服务器上的敏感数据。

防御措施

  • 禁止上传压缩包:限制上传文件类型,避免允许上传压缩包。

  • 解压前扫描:在解压上传的压缩包前,对其进行病毒扫描或内容扫描。


2.文件下载的安全隐患

2.1路径解析漏洞


Web 服务器在处理文件下载请求时,若对文件路径的解析逻辑存在缺陷,就会产生路径解析漏洞。部分 Web 服务器支持文件多重后缀名特性,攻击者利用这一特性构造恶意文件名,干扰服务器路径解析。

假设服务器允许下载example.jpg文件,攻击者构造文件名example.jpg../sensitive.txt。若服务器对路径解析不够严谨,在处理该文件名时,可能会错误地将../sensitive.txt文件下载给攻击者,导致敏感信息泄露。这种漏洞的产生往往源于服务器对文件名中特殊字符和路径分隔符的处理不当,使得攻击者能够通过精心构造文件名,突破服务器预期的文件访问范围。

路径解析漏洞

1. 利用 Web 服务器支持文件多重后缀名的特性

某些 Web 服务器支持文件多重后缀名(如 .php.html ),攻击者可以通过构造特殊的文件名,绕过服务器的文件类型检查。

漏洞利用方式

  • 构造多重后缀名:攻击者上传的文件名包含多个后缀名,利用服务器对后缀名的处理逻辑,绕过验证。

  • 利用服务器解析顺序:服务器可能会优先解析第一个后缀名,导致恶意脚本被执行。

漏洞的危害

  • 恶意代码执行:攻击者上传的恶意脚本可能被服务器执行,控制服务器。

  • 敏感信息泄露:攻击者可能通过恶意脚本窃取服务器上的敏感数据。

防御措施

  • 严格限制文件后缀名:只允许上传特定的文件后缀名,避免多重后缀名。

  • 文件名规范化处理:对上传的文件名进行规范化处理,去除多余的后缀名。


2.2路径穿越攻击与任意文件读取漏洞


路径穿越攻击是文件下载安全中的重大威胁。攻击者在文件下载请求的路径参数中使用特殊字符(如../),意图跳出应用程序设定的文件目录,访问其他文件。若服务器未对路径参数进行严格过滤和校验,攻击者就能实现任意文件读取漏洞。

例如,在一个简单的文件下载功能中,URL 参数可能为download.php?file=example.txt,攻击者将其修改为download.php?file=../../../etc/passwd。若服务器未对file参数进行有效验证,就会将/etc/passwd文件(在 Linux 系统中存储用户账号信息)下载给攻击者,攻击者借此获取大量用户账号和密码信息(若密码未进行安全存储),对系统安全造成严重破坏。


2.3Nginx 配置不正确造成的路径穿越漏洞


Nginx 作为一款广泛使用的 Web 服务器,若配置不当,极易引发路径穿越漏洞。在 Nginx 的配置文件中,aliasroot指令用于指定文件路径映射关系。若使用不当,如alias指令设置的路径末尾缺少斜杠(/),可能导致服务器将用户请求的路径错误地映射到非预期目录。攻击者通过构造特殊路径请求,

/path/to/../sensitive/file,利用配置错误实现路径穿越攻击,访问服务器上的敏感文件,如网站的配置文件、数据库连接文件等,获取关键信息,进而对服务器发起进一步攻击。

(二)文件上传与下载的安全策略

1.文件上传安全

1.1 文件路径信息的安全

漏洞利用方式
  • 路径穿越攻击:攻击者通过构造恶意的文件路径,访问服务器上的任意文件。
  • 任意文件读取漏洞:攻击者通过文件下载接口,下载服务器上的任意文件。
防御措施
  • 严格的路径验证:对用户提供的文件路径进行严格的验证,确保其在允许的范围内。
  • 使用白名单机制:只允许访问特定的文件路径。

1.2 文件内容的安全

漏洞利用方式
  • 文件包含漏洞:攻击者通过文件包含功能,包含服务器上的任意文件,获取敏感信息。
  • 恶意代码上传:攻击者上传包含恶意代码的文件,通过文件下载接口传播恶意代码。
防御措施
  • 内容扫描:对上传的文件进行内容扫描,检测是否存在恶意代码。
  • 限制文件类型:只允许上传特定的文件类型,避免上传可执行脚本。

2.文件包含漏洞

2.1本地文件包含与远程文件包含
本地文件包含

攻击者通过构造恶意的文件路径,包含服务器上的本地文件,获取敏感信息。

远程文件包含

攻击者通过构造恶意的文件路径,包含远程服务器上的文件,实现跨站攻击。

漏洞利用方式
  • 读取敏感文件:攻击者通过包含 /etc/passwd 等系统文件,获取服务器的用户信息。
  • 执行恶意代码:攻击者通过包含远程的恶意脚本文件,执行恶意代码。
防御措施
  • 严格的路径验证:对文件路径进行严格的验证,确保其在允许的范围内。
  • 禁用文件包含功能:关闭不必要的文件包含功能,减少攻击面。

2.2用文件包含实现拒绝服务攻击

攻击者可以通过文件包含漏洞,包含大量的文件,消耗服务器的资源,导致服务不可用。

漏洞利用方式
  • 包含大量小文件:攻击者通过包含大量小文件,消耗服务器的 I/O 资源。
  • 包含大文件:攻击者通过包含超大文件,消耗服务器的内存和磁盘空间。
防御措施
  • 限制文件包含的数量和大小:对文件包含的数量和大小进行限制,防止资源耗尽。
  • 监控服务器资源:实时监控服务器的资源使用情况,及时发现异常。

3.文件上传安全策略

3.1路径信息的安全考虑

  • 随机化存储路径:为有效防止文件存储路径被攻击者预测,应采用复杂且随机的方式生成路径。可利用高强度随机数生成算法,结合用户 ID、时间戳以及其他唯一标识信息生成难以猜测的路径。例如,使用 UUID(通用唯一识别码)与用户 ID 和时间戳组合,生成类似/uploads/550e8400 - e29b - 41d4 - a716 - 446655440000/2023 - 10 - 05 - 14 - 23 - 59/file.jpg的路径。这种随机化路径极大增加了攻击者猜测路径的难度,降低了因路径可预测导致的文件被未授权访问风险。
  • 限制路径深度:对上传文件的存储路径深度进行合理限制,避免路径过于复杂或过长。复杂过长的路径不仅增加管理难度,还可能为路径穿越攻击提供更多机会。同时,确保路径中不包含敏感信息,如系统根目录(在 Linux 系统中为/,在 Windows 系统中为C:\等)、关键配置文件所在目录(如/etcC:\Windows\System32等)。通过限制路径深度和排除敏感信息,可有效降低攻击者利用路径进行恶意操作的可能性。
  • 权限管理:为上传文件的存储目录和文件设置合理权限至关重要。上传目录权限应设置为仅允许应用程序进行读写操作,禁止其他用户或进程对该目录进行不必要的访问和操作。例如,在 Linux 系统中,可将上传目录权限设置为700(所有者具有读、写、执行权限,组用户和其他用户无任何权限)。这样,即使攻击者通过其他途径获取到文件路径,也因缺乏访问权限而无法对文件进行查看、修改或删除等操作,保障了文件的安全性。

3.2文件内容的安全考虑

  1. 严格的文件类型校验:在服务端进行严格的文件类型校验,不能仅依赖文件后缀名或 Content-Type。文件头检查(魔数检查)是一种更可靠的方式,通过读取文件前几个字节,根据不同文件类型特定的字节序列来判断文件真实类型。例如,JPEG 图片文件头通常以FF D8开头,PNG 图片文件头以89 50 4E 47 0D 0A 1A 0A开头。同时,结合白名单机制,明确列出应用程序允许上传的文件类型,如常见图片格式(.jpg.png.gif)、文档格式(.pdf.docx.txt)等,对于不在白名单内的文件类型,一律拒绝上传。通过这种双重校验方式,可有效防止恶意文件伪装上传。
  2. 文件内容扫描:利用专业的杀毒软件引擎或恶意代码检测工具对上传文件内容进行全面扫描。一些开源杀毒软件引擎,如 ClamAV,可集成到 Web 应用中,在文件上传时实时扫描。对于检测到包含病毒、恶意脚本(如 JavaScript 恶意代码、PHP 恶意脚本等)的文件,立即拒绝上传,并向用户返回清晰明确的错误提示,告知用户文件存在安全风险。通过文件内容扫描,可及时发现并阻止恶意文件进入服务器,保障服务器和用户数据安全。
  3. 文件大小限制:合理设置文件大小限制,避免因上传过大文件导致服务器资源耗尽。在服务端和前端都应进行文件大小校验,防止攻击者绕过前端校验上传超大文件。根据应用程序实际需求和服务器性能,确定合适的文件大小上限。例如,对于一般图片上传,可限制在 10MB 以内;对于文档上传,可根据文档类型和实际使用场景,设置在几十 MB 到几百 MB 不等。通过文件大小限制,既能保证正常文件上传功能不受影响,又能防止因超大文件上传对服务器资源造成过度消耗。
  4. 文件重命名:在文件上传时,对用户上传的原始文件名进行重命名,使用随机生成的文件名。这样可防止攻击者利用文件名中的特殊字符或恶意代码进行攻击。例如,将用户上传的evil.php文件重命名为9876543210abcdef9876543210abcdef.jpg。即使文件类型被误判,由于文件名被修改,攻击者也难以通过文件名直接触发恶意代码执行,在一定程度上降低了攻击风险。

4.文件下载安全

4.1路径信息的安全考虑

  • 路径规范化:在处理文件下载请求时,对请求路径进行规范化处理。去除路径中的冗余字符,如连续斜杠(//)、不符合规范的../等,确保路径为绝对路径且在应用程序允许的范围内。可使用编程语言提供的路径处理函数,如 Python 中的os.path.normpath函数,对路径进行规范化操作。例如,将/path//to/../file.txt规范化为/path/file.txt。通过路径规范化,可有效防止路径穿越攻击,确保用户只能下载应用程序允许的文件。
  • 权限验证:在允许文件下载前,对用户权限进行严格验证。结合用户身份认证和授权系统,如基于角色的访问控制(RBAC),根据用户角色和权限决定是否允许下载特定文件。例如,普通用户可能只允许下载公开文件和自己上传的文件,而管理员用户则具有下载所有文件的权限。通过严格权限验证,可防止未授权用户访问敏感文件,保障文件下载的安全性。

4.2文件内容的安全考虑

  • 输出过滤:在将文件内容输出给用户前,对文件内容进行过滤,防止文件中可能包含的恶意代码在用户端执行。对于 HTML 文件,对其中可能用于执行恶意脚本的标签,<script><iframe>等进行过滤或转义。例如,将<script>标签转义为&lt;script&gt;,使浏览器将其作为普通文本显示,而非执行脚本。通过输出过滤,可有效保护用户在下载和查看文件时,不会受到恶意代码攻击,保障用户设备安全。
  • 完整性校验:在文件下载过程中,为确保文件完整性,可使用哈希算法(如 MD5、SHA - 1、SHA - 256 等)对文件进行校验。在服务器端生成文件哈希值,并将其传递给用户。用户下载完成后,重新计算文件哈希值,并与服务器传递的哈希值比对。若哈希值不一致,说明文件在传输过程中可能被篡改,用户可选择重新下载文件。例如,服务器计算文件example.txt的 SHA - 256 哈希值为abcdef1234567890abcdef1234567890,将其随文件下载链接一起发送给用户。用户下载文件后,使用相同哈希算法计算文件哈希值,若不一致,可提示用户文件可能存在问题,需重新下载。通过完整性校验,可保证用户获取到的文件与服务器上的原始文件一致,防止文件被中间人篡改。

(三)对象存储的安全问题

随着云计算技术的飞速发展,对象存储服务(如 Amazon S3、阿里云 OSS、腾讯云 COS 等)在 Web 应用中得到广泛应用。然而,对象存储也存在诸多安全问题需要高度关注。

  1. 访问权限管理:对象存储服务提供丰富的访问权限控制功能,但配置不当易引发安全漏洞。例如,若将存储桶(Bucket)或对象的权限设置为公开可读可写,所有用户都能访问和修改存储在其中的文件。因此,必须依据应用程序实际需求,精确设置访问权限。遵循最小权限原则,仅授予必要用户或角色对存储桶和对象的访问权限。例如,对于一个企业内部的文件存储应用,可将普通员工设置为只能读取特定文件夹下的文件,而管理员具有读写所有文件的权限。通过精细的权限管理,可有效防止未授权访问和数据泄露。
  2. 数据加密:在对象存储中,数据加密至关重要。对于敏感数据,在上传到对象存储前应进行加密,确保数据在存储和传输过程中的保密性。可使用对称加密算法(如 AES)或非对称加密算法(如 RSA)对数据进行加密,并妥善保管加密密钥。部分对象存储服务本身提供数据加密功能,如服务器端加密(SSE)。用户可根据数据敏感程度和安全需求,选择合适的加密方式。例如,对于高度敏感的用户个人信息数据,可采用 AES - 256 加密算法进行加密后再上传到对象存储服务,保障数据安全。
  3. 跨区域复制与数据备份:在使用对象存储服务时,可能涉及跨区域复制和数据备份操作。在这些操作过程中,要确保数据一致性和完整性,并注意安全问题。跨区域复制时,防止数据在传输过程中被窃取或篡改,可采用加密

总结

文件操作是 Web 应用中不可或缺的功能模块,但同时也是攻击者眼中的高价值目标。从文件上传、下载到文件包含、路径穿越,每一步都潜藏着巨大的安全风险。攻击者可以通过构造恶意文件、利用服务器的解析漏洞等方式,实现对服务器的控制或窃取敏感信息。

作为开发者和安全人员,我们需要高度重视文件操作的安全问题,采取严格的防御措施,如文件类型检查、路径验证、内容扫描等,确保文件操作的安全性。同时,也需要不断学习新的安全技术和防护策略,以应对日益复杂的网络安全威胁通过。

深入学习《白帽子讲 Web 安全》中的文件操作章节,我们能够更全面地认识文件操作中的安全风险,并掌握相应的防护措施,为 Web 应用的安全性保驾护航。


喜欢的点点赞和关注,一起进步

相关文章:

《白帽子讲 Web 安全》之文件操作安全

目录 引言 &#xff08;一&#xff09;文件上传与下载漏洞概述 1.文件上传的常见安全隐患 1.1前端校验的脆弱性与服务端脚本执行危机在文件上传流程中&#xff0c;部分开发者可能会在前端使用 JavaScript 代码对文件后缀名进行简单校验&#xff0c;试图以此阻止非法文件上传…...

【AI】AI开源IDE:CLine源码分析报告

1. 源码位置&#xff1a; CLine 是一个开源的 VSCode 插件&#xff0c;其完整源码托管在 GitHub 的 cline/cline 仓库中。这个仓库包含 CLine 的核心逻辑&#xff08;TypeScript 编写&#xff09;&#xff0c;包括与 LLM 的对话控制、工具调用接口&#xff0c;以及 VSCode 插件…...

使用数据库和缓存的时候,是如何解决数据不一致的问题的?

1.缓存更新策略 1.1. 缓存旁路模式&#xff08;Cache Aside&#xff09; 在应用里负责管理缓存&#xff0c;读取时先查缓存&#xff0c;如果命中了则返回缓存&#xff0c;如果未命中就查询数据库&#xff0c;然后返回缓存&#xff0c;返回缓存的同时把数据给写入缓存中。更新…...

docker compose 以redis为例

常见docker compose 命令 》》注意这个是旧版本的&#xff0c;新版本 docker 与compose 之间没有 - 新版本的 docker compose 把 version 取消了 &#xff0c;redis 默认是没有配置文件的 &#xff0c;nginx&#xff0c;mysql 默认是有的 services:redis:image: redis:lat…...

基于Kubernetes部署MySQL主从集群

以下是一个基于Kubernetes部署MySQL主从集群的详细YAML示例&#xff0c;包含StatefulSet、Service、ConfigMap和Secret等关键配置。MySQL主从集群需要至少1个主节点和多个从节点&#xff0c;这里使用 StatefulSet 初始化脚本 实现主从自动配置。 1. 创建 Namespace (可选) ap…...

VMware中安装配置Ubuntu(2024最新版 超详细)

目录 一、安装虚拟机软件 二、VMware虚拟机 三、 Ubuntu 下载 &#xff08;1&#xff09;官网下载 &#xff08;2&#xff09;清华镜像网站下载 四、创建虚拟机 五、Ubuntu 系统安装过程的配置 六、更换国内镜像源 七、环境搭建完毕 全篇较长&#xff0c;请慢慢观看 一…...

【Linux】信号处理以及补充知识

目录 一、信号被处理的时机&#xff1a; 1、理解&#xff1a; 2、内核态与用户态&#xff1a; 1、概念&#xff1a; 2、重谈地址空间&#xff1a; 3、处理时机&#xff1a; 补充知识&#xff1a; 1、sigaction&#xff1a; 2、函数重入&#xff1a; 3、volatile&…...

如何在rust中解析 windows 的 lnk文件(快捷方式)

一、从标题二开始看&#x1f601; 这些天在使用rust写一个pc端应用程序&#xff0c;需要解析lnk文件获取lnk的图标以及原程序地址&#xff0c;之前并没有过pc端应用程序开发的经验&#xff0c; 所以在广大的互联网上游荡了两天。额&#x1f97a; 今天找到了这个库 lnk_parse很…...

大模型系列课程学习-基于Vllm/Ollama/Ktransformers完成Deepseek推理服务部署

1.机器配置及实验说明 基于前期搭建的双卡机器装机教程&#xff0c;配置如下&#xff1a; 硬件名称参数备注CPUE5-2680V42 *2&#xff08;线程28个&#xff09;无GPU2080TI-22G 双卡魔改卡系统WSL Unbuntu 22.04.5 LTS虚拟机 本轮实验目的&#xff1a;基于VLLM/Ollama/ktran…...

Unity Shader学习总结

1.帧缓冲区和颜色缓冲区区别 用于存储每帧每个像素颜色信息的缓冲区 帧缓冲区包括&#xff1a;颜色缓冲区 深度缓冲区 模板缓冲区 自定义缓冲区 2.ImageEffectShader是什么 后处理用的shader模版 3.computerShader 独立于渲染管线之外&#xff0c;在显卡上运行&#xff0c;大量…...

Java多线程与高并发专题——什么是阻塞队列?

引入 阻塞队列&#xff08;Blocking Queue&#xff09;是一种线程安全的队列数据结构&#xff0c;它的主要特点是&#xff1a; 线程安全&#xff1a;多个线程可以安全地同时访问队列。阻塞操作&#xff1a;当队列为空时&#xff0c;从队列中获取元素的操作会被阻塞&#xff0…...

【Recon】CTF Web类题目主要类型

CTF Web类题目主要类型 1. 信息搜集类2. 注入类漏洞3. 文件处理漏洞4. 身份验证与会话漏洞5. 服务端漏洞6. 客户端漏洞7. 代码审计与PHP特性8. 业务逻辑漏洞总结 CTF&#xff08;Capture The Flag&#xff09;竞赛中的Web类题目主要考察参赛者对Web应用漏洞的识别与利用能力&am…...

comfyui(python)下载insightface失败

使用comfyui时&#xff0c;安装插件zenid、instantid、ip-adapter等换脸插件时&#xff0c;因为依赖insightface安装失败&#xff0c;导致插件中的节点无法正常使用&#xff0c;需要单独安装insightface。 下载insightface到本地&#xff0c;下载地址 选择与自己python版本一致…...

《DataWorks 深度洞察:量子机器学习重塑深度学习架构,决胜复杂数据战场》

在数字化浪潮汹涌澎湃的当下&#xff0c;大数据已然成为推动各行业发展的核心动力。身处这一时代洪流&#xff0c;企业对数据的处理与分析能力&#xff0c;直接关乎其竞争力的高低。阿里巴巴的DataWorks作为大数据领域的扛鼎之作&#xff0c;凭借强大的数据处理与分析能力&…...

Docker小游戏 | 使用Docker部署DOS游戏合集

Docker小游戏 | 使用Docker部署DOS游戏合集 前言项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署dos-games网页小游戏下载镜像创建容器检查容器状态检查服务端口检查容器日志安全设置四、访问DOS游戏网页五、进阶玩法下载游戏拷贝…...

【redis】慢查询分析与优化

慢查询指在Redis中执行时间超过预设阈值的命令&#xff0c;其日志记录是排查性能瓶颈的核心工具。Redis采用单线程模型&#xff0c;任何耗时操作都可能阻塞后续请求&#xff0c;导致整体性能下降。 命令的执行流程 根据Redis的核心机制&#xff0c;命令执行流程可分为以下步骤…...

ThinkPHP框架

在电脑C磁盘中安装composer 命令 在电脑的D盘中创建cd文件夹 切换磁盘 创建tp框架 创建一个aa的网站&#xff0c;更换路径到上一步下载的tp框架路径 在管理中修改路径 下载压缩包public和view 将前面代码中的public和view文件替换 在PHPStom 中打开文件 运行指定路径 修改demo…...

从零构建高可用MySQL自动化配置系统:核心技术、工具开发与企业级最佳实践

在现代企业级数据库管理中,手动配置 MySQL 已无法满足高效、稳定和可扩展的需求。本文从 MySQL 配置管理的核心原理 出发,深入剖析 自动化配置工具的架构设计、关键技术实现,并结合 企业级落地方案,帮助读者构建一套 高可用、智能化的 MySQL 自动化配置系统。无论是 DevOps…...

qt 播放pcm音频

一、获取PCM音频 ffmpeg -i input.mp3 -acodec pcm_s16le -ar 44100 -ac 2 -f s16le output.pcm -acodec pcm_s16le&#xff1a;指定16位小端PCM编码格式&#xff08;兼容性最佳&#xff09;-ar 44100&#xff1a;设置采样率为CD标准44.1kHz&#xff08;可替换为16000/8000等&a…...

开启mysql远程登录

目录 前言开启步骤 前言 为了安全考虑&#xff0c;mysql默认不允许远程登录&#xff0c;需要我们自己开启。当然在远程登录之前mysql的端口也要开放。下面是mysql开启远程登录的步骤。 开启步骤 本地登录mysql mysql -u root -p然后输入登录密码 给登录账号授权 GRANT AL…...

中级网络工程师面试题参考示例(5)

企业园区网络设计 问题&#xff1a; 请描述一下如何设计一个企业园区网络&#xff0c;包括核心层、汇聚层和接入层的功能及其关键技术。 解答&#xff1a; 核心层&#xff1a;负责高速数据交换&#xff0c;通常使用高性能的三层交换机&#xff0c;支持高带宽和低延迟。关键技…...

【每日学点HarmonyOS Next知识】输入框自动获取焦点、JS桥实现方式、Popup设置全屏蒙版、鼠标事件适配、Web跨域

1、HarmonyOS TextInput或TextArea如何自动获取焦点&#xff1f; 可以使用 focusControl.requestFocus 对需要获取焦点的组件设置焦点&#xff0c;具体可以参考文档&#xff1a; https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-attribut…...

Git学习笔记(二)

Git学习笔记&#xff08;二&#xff09; 下载VSCode创建本地仓库推送远程仓库界面功能 使用 VSCode 进行Git仓库的项目管理 这篇文章是我学完使用 命令行终端 管理Git仓库额外学习的 文章主要用于巩固和方便后续复习 下载VSCode 可以看我这篇文章下载VSCode 创建本地仓库 …...

UDP协议和报文格式

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网络安全从菜鸟到飞鸟的逆袭 目录 一&#xff0c;UDP协议1&#xff0…...

Java TCP 通信:实现简单的 Echo 服务器与客户端

TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输层协议。与 UDP 不同&#xff0c;TCP 保证了数据的顺序、可靠性和完整性&#xff0c;适用于需要可靠传输的应用场景&#xff0c;如文件传输、网页浏览等。本文将基于 Java 实现一个简单的…...

升级到Android Studio 2024.2.2 版本遇到的坑

一、上来就编译报错&#xff0c;大概率是因为选择了替换安装&#xff0c;本地配置文件出错 找到本地当前版本的配置文件&#xff0c;删掉&#xff0c;重启studio就好了&#xff1a; 1、打开终端 2、“cd /Users/用户名/Library/Application\ Support/Google” //到Google目录 …...

hom_mat2d_to_affine_par 的c#实现

hom_mat2d_to_affine_par 的c#实现 背景&#xff1a;为课室贡献一个通用函数&#xff0c;实现halcon算子的同等效果&#xff0c;查询csdn未果&#xff0c;deepseek二哥与chtgpt大哥给不了最终程序&#xff0c;在大哥与二哥帮助下&#xff0c;最终实现同等效果。 踩坑&#xf…...

#9 【code】实现扩散模型的一个jupyter notebook

今天以一个简单的notebook入手,学习一下扩散模型的运行流程。有点困难不要紧,一个人吃了六个馒头才饱,他是吃第一个饱的,还是第六个饱的呢?始终坚信,现在的技术积累,终会成为未来高楼大厦的根基! import torch import torchvision import matplotlib.pyplot as pltdef …...

三星首款三折叠手机被曝外屏6.49英寸:折叠屏领域的新突破

在智能手机的发展历程中,折叠屏手机的出现无疑是一次具有里程碑意义的创新。它打破了传统手机屏幕尺寸的限制,为用户带来了更加多元和便捷的使用体验。而三星,作为手机行业的巨头,一直以来都在折叠屏技术领域积极探索和创新。近日,三星首款三折叠手机的诸多细节被曝光,其…...

《OkHttp:工作原理 拦截器链深度解析》

目录 一、OKHttp 的基本使用 1. 添加依赖 2. 发起 HTTP 请求 3. 拦截器&#xff08;Interceptor&#xff09; 4. 高级配置 二、OKHttp 核心原理 1. 责任链模式&#xff08;Interceptor Chain&#xff09; 2. 连接池&#xff08;ConnectionPool&#xff09; 3. 请求调度…...

Python 中多种方式获取屏幕的 DPI值

在 Python 中&#xff0c;可以通过多种方式获取屏幕的 DPI&#xff08;每英寸点数&#xff09;。以下是几种常见的方法&#xff1a; 方法 1&#xff1a;使用 tkinter 模块 tkinter 是 Python 的标准 GUI 库&#xff0c;可以通过它获取屏幕的 DPI。 import tkinter as tkdef …...

linux安装Mariadb10.5并修改端口

首先配置yum源 进入下方的文件进行配置 vim /etc/yum.repos.d/MariaDB.repo填写下方内容 [mariadb]name MariaDBbaseurl https:///mirrors.aliyun.com/mariadb/yum/10.5/centos8-amd64/gpgkeyhttps:///mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDBmodule_hotfixes…...

Java EE 进阶:Spring IoCDI

IOC的简单介绍 什么是Spring&#xff1f;Spring是一个开源的框架&#xff0c;让我们的开发更加的简单&#xff0c;我们可以用一句更加具体的话来概括Spring&#xff0c;就是Spring是一个包含众多工具方法的IOC容器。 简单介绍一下IOC&#xff0c;我们之前说过通过ReqestContr…...

蓝桥杯备考:图论初解

1&#xff1a;图的定义 我们学了线性表和树的结构&#xff0c;那什么是图呢&#xff1f; 线性表是一个串一个是一对一的结构 树是一对多的&#xff0c;每个结点可以有多个孩子&#xff0c;但只能有一个父亲 而我们今天学的图&#xff01;就是多对多的结构了 V表示的是图的顶点集…...

JVM类加载器面试题及原理

JVM只会运行二进制文件&#xff0c;类加载器的作用就是将字节码文件加载到JVM中&#xff0c;从而让Java程序能够启动起来。 1. 类加载器的种类 启动类加载器&#xff08;BootStrap ClassLoader&#xff09;&#xff1a;加载JAVA_HOME/jre/lib目录下的库扩展类加载器&#xff…...

《V8 引擎狂飙,Node.js 续写 JavaScript 传奇》

”你没想过也许是这个镇子对你来说太小了吗&#xff1f; 对我而言&#xff0c;这个小镇容不下我的雄心壮志。 “ 什么是 Node.js&#xff1f; Node.js是一个跨平台JS运行环境&#xff0c;使开发者可以搭建服务器端的JS应用程序 作用&#xff1a;使用 Node.js 编写服务器端程序…...

关于Springboot 应配置外移和Maven个性化打包一些做法

期望达到的效果是每次更新服务器端应用只需要更新主程序jar 依赖jar单独分离。配置文件独立存放于文件夹内&#xff0c;更新程序并不会覆盖已有的配置信息。 一、配置外移 1、开发环境外移 做法&#xff1a;在项目同级或者上级创建config文件夹放置配置文件&#xff0c;具体m…...

Lab18_ SQL injection with filter bypass via XML encoding

文章目录 前言&#xff1a;进入实验室构造 payload 前言&#xff1a; 实验室标题为&#xff1a; 通关 XML 编码绕过过滤器的 SQL 注入 简介&#xff1a; 此实验室的库存检查功能中存在 SQL 注入漏洞。查询结果在应用程序的响应中返回&#xff0c;因此您可以使用 UNION 攻击…...

网络空间安全(21)验证码安全

一、基本概念 验证码&#xff08;CAPTCHA&#xff09;是“Completely Automated Public Turing test to tell Computers and Humans Apart”&#xff08;全自动区分计算机和人类的图灵测试&#xff09;的缩写&#xff0c;是一种区分用户是计算机还是人的公共全自动程序。它通过…...

DMA在STM32中的应用

在STM32微控制器中,DMA(直接内存访问)是实现高效数据搬运的核心技术,能够显著减轻CPU负担并提升系统性能。以下是STM32中DMA的典型应用及配置方法: 1. STM32的DMA控制器架构 DMA控制器数量:不同系列配置不同,如STM32F1系列有1个DMA控制器(DMA1,7通道),F4系列有2个(…...

V8引擎中的垃圾回收机制如何工作?

V8引擎中的垃圾回收机制主要通过分代回收和增量标记清除算法来管理内存。以下是其工作原理的详细说明&#xff1a; V8 的垃圾回收机制基于以下核心设计原则&#xff1a; 1. 分代假设&#xff1a;大多数对象的生命周期很短&#xff0c;只有少数对象会存活较长时间&#xff1b;…...

汇编的伪指令

一、介绍 伪指令是用于对汇编过程进行控制的指令&#xff0c;该类指令并不是可执行指令&#xff0c;没有对应机器码&#xff0c;只用于汇编过程中为汇编程序提供汇编信息&#xff0c;帮助编译器编译。当汇编结束时&#xff0c;伪指令的使命也就结束了。伪操作可以实现如下功能…...

【TI】如何更改 CCS20.1.0 的 WORKSPACE 默认路径

参考链接&#xff1a; 如何更改 CCS Theia 中工作区的默认位置&#xff1f;- Code Composer Studio 论坛 - Code Composer Studio™︎ - TI E2E 支持论坛 --- How to change the default location for the workspace in CCS Theia? - Code Composer Studio forum - Code Comp…...

GStreamer —— 2.13、Windows下Qt加载GStreamer库后运行 - “教程13:播放控制“(附:完整源码)

运行效果(音频) 简介 上一个教程演示了GStreamer工具。本教程介绍视频播放控制。快进、反向播放和慢动作都是技术 统称为 Trick Modes&#xff0c;它们都有一个共同点 修改 Normal playback rate。本教程介绍如何实现 这些效果并在交易中添加了帧步进。特别是&#xff0c;它 显…...

推荐一款好用在线免费软件工具箱-传道软件箱

推荐一款好用在线免费软件工具箱-传道软件箱 传道软件箱 传道软件箱是一款在线免费软件工具箱&#xff0c;无需登录&#xff0c;无需费用&#xff0c;用完就走的软件工具&#xff0c;包有BMI计算、倒计时、单位转换、密码生成器、摩斯电码、代码编辑器、计算器、快递查询、二维…...

机器学习数学基础:40.结构方程模型(SEM)中卡方值与卡方自由度比

结构方程模型&#xff08;SEM&#xff09;中卡方值与卡方自由度比教程 在结构方程模型分析里&#xff0c;卡方值和卡方自由度比是评估模型拟合程度的重要指标&#xff0c;下面为大家详细介绍。 一、卡方值&#xff08;CMIN&#xff09; &#xff08;一&#xff09;基本概念与…...

【JavaEE进阶】Spring AOP详解

目录 &#x1f343;什么是AOP &#x1f333;什么是Spring AOP &#x1f334;上手Spring AOP &#x1f6a9;引入依赖 &#x1f6a9;编写AOP程序 &#x1f38d;Spring AOP核心概念 &#x1f6a9;切点(Pointcut) &#x1f6a9;连接点(Join Point) &#x1f6a9;通知(Advi…...

Docker 的基本概念和优势,以及在应用程序开发中的实际应用

Docker 是一种开源的容器化平台&#xff0c;让开发人员能够打包、发布和运行应用程序在轻量级、可移植的容器中。Docker 容器包含应用程序的代码、运行时环境、系统工具、系统库等&#xff0c;使得应用程序能在任何环境中快速部署和运行。 Docker 的基本概念包括以下几点&…...

python flask

安装 pip install flask 查看版本 pip show flask 启动服务器 设置环境变量&#xff0c;在控制台执行命令&#xff0c;app.py是创建的文件名 windows set FLASK_APPapp.py mac/linux export FLASK_APPapp.py 启动内置web服务器&#xff0c;注意要进入到app.py所在的文…...

关于tomcat使用中浏览器打开index.jsp后中文显示不正常是乱码,但英文正常的问题

如果是jsp文件就在首行加 “<% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %>” 如果是html文件 在head标签加入&#xff1a; <meta charset"UTF-8"> 以jsp为例子&#xff0c;我们…...