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

Web安全测试实战指南:从SQL注入到XSS的手动漏洞挖掘与验证

1. 项目概述:为什么我们需要这份指南?

如果你是一名刚入行的开发、测试,或者是对Web安全感兴趣的爱好者,面对“安全测试”这个词,是不是感觉既熟悉又陌生?熟悉的是,新闻里隔三差五就有某大厂数据泄露、某平台被“拖库”的报道;陌生的是,当你想为自己的项目做点什么时,却发现无从下手。SQL注入、XSS、CSRF……这些术语听起来像黑话,各种扫描工具的结果报告看得人眼花缭乱,更别提手动去验证和利用了。这正是我写这份指南的初衷。它不是一份冷冰冰的学术论文,也不是某个安全产品的说明书,而是我过去几年在甲方做安全建设、在乙方做渗透测试服务时,踩过无数坑、交过不少“学费”后,总结出的一套面向实战的“生存手册”。

这份指南的核心目标很明确:帮你建立对Web应用常见漏洞的立体认知,并掌握一套可立即上手的基础测试方法。我们不追求成为能挖出0day漏洞的大神,那需要长期的积累和天赋。我们首先要做到的,是能识别和防范那些占了实际安全事件90%以上的“常见病”、“多发病”。想象一下,你开发或维护的一个Web应用,可能因为一个未经验证的用户输入,就导致整个数据库被拖走;或者因为一个错误的会话管理逻辑,让用户的账户可以被他人轻易接管。这些风险是真实存在的,而防御它们的第一步,就是知道它们长什么样,以及如何用最简单的方法去检查。

所以,无论你是想提升自己项目的安全性,还是打算向安全测试领域转型,这份指南都将从一个真正的从业者视角,带你绕过那些华而不实的理论,直接切入核心。我们会从最经典的OWASP Top 10漏洞入手,但不止于概念,我会重点分享在实际测试环境中,如何利用浏览器开发者工具、简单的代理工具、甚至几行代码去验证这些漏洞的存在。我会告诉你哪些自动化工具可以信赖,但更会强调手动测试的关键性,因为机器永远无法完全替代人的逻辑思维。安全测试,本质上是一场攻防思维的对决,而这份指南,就是你进入战场的第一个装备包。

2. 核心漏洞原理与手动测试方法论

在开始挥舞工具之前,我们必须先理解“敌人”是如何工作的。Web应用漏洞虽然名目繁多,但其核心原理往往围绕着几个关键点:信任边界的突破、输入输出的失控、以及逻辑上下文的混淆。下面,我们就拆解几个最具代表性的漏洞,并同步讲解如何手动进行测试。

2.1 注入类漏洞:当数据变成指令

注入漏洞的本质,是程序没有严格区分“数据”和“代码”。用户输入的数据,被意外地当作程序指令的一部分执行了。这其中,SQL注入无疑是鼻祖,也是最危险的一种。

SQL注入原理与手动测试:假设一个登录功能的后台代码是这样的:SELECT * FROM users WHERE username = ‘“ + userInput + ”’ AND password = ‘…‘。当用户在用户名框输入admin‘ --时,最终的SQL语句就变成了SELECT * FROM users WHERE username = ‘admin‘ --’ AND password = ‘…‘--在SQL中是注释符,这意味着密码检查被完全绕过了,系统会返回用户名为admin的第一条记录,攻击者就此以管理员身份登录。

手动测试方法:

  1. 探测点寻找:任何用户可控的输入点都是怀疑对象:URL参数(如?id=1)、表单字段(登录、搜索、评论)、HTTP头部(如Cookie、User-Agent,有时也会被记录到数据库)。
  2. 基础探测:在参数后尝试添加一个单引号。比如将id=1改为id=1‘。观察页面响应:如果出现数据库错误信息(如MySQL、PostgreSQL的错误提示),说明此处可能存在注入点且错误信息被直接返回,这是“显错注入”。如果页面显示异常(空白、部分内容缺失)但与正常页面不同,则可能是“盲注”点。
  3. 逻辑验证:尝试构造永真或永假条件。例如:
    • 永真:id=1‘ and ‘1‘=‘1id=1‘ or 1=1 --
    • 永假:id=1‘ and ‘1‘=‘2如果永真时页面正常显示数据,永假时无数据或报错,则基本确认存在SQL注入。
  4. 信息获取:确认注入后,可以进一步利用数据库的内置函数获取信息。例如,在MySQL中,union select 1,2,database(),user(),version()--这样的语句可以查询当前数据库名、用户和版本。这里必须注意:使用union查询的前提是前后SELECT语句的列数必须一致,这通常需要通过order by子句来试探列数,例如id=1‘ order by 5--,不断增加数字直到页面报错,即可确定列数。

实操心得:不要依赖工具扫出来“可能存在注入”就下结论。工具会报很多误报。一定要手动验证,观察页面响应的细微差别。有时候,时间盲注(通过sleep(5)等函数根据页面返回时间判断)是唯一的手段,这就需要你有足够的耐心。

2.2 跨站脚本攻击:在别人的地盘执行你的代码

XSS的核心原理是“HTML注入”。攻击者将恶意脚本代码(通常是JavaScript)植入到Web页面中,当其他用户浏览该页面时,脚本就会在其浏览器上下文(即其会话权限下)执行。

反射型XSS手动测试:这是最常见也最简单的一种。漏洞出现在服务端直接“反射”用户输入到响应页面中,且未做过滤。

  1. 寻找回显点:找到一个搜索框、URL参数等,输入一串独特的字符,如test123,提交后观察页面,看你的输入是否原样出现在页面的某个位置(HTML正文、标签属性内等)。
  2. 构造测试载荷:在回显点尝试输入基本的XSS探测代码:“><script>alert(1)</script>。如果弹窗出现,证明漏洞存在。为什么是这个格式?假设回显点在<input value=“USER_INPUT”>里,我们的输入就闭合了前面的value属性,并插入了一个新的<script>标签。
  3. 探测过滤与编码:如果弹窗没出现,查看页面源代码,看你的输入被如何处理了。是被转义了(如<变成&lt;)?还是被过滤了(<script>标签被移除)?可以尝试变体,如<img src=1 onerror=alert(1)>(利用图片标签的加载错误事件),或者大小写混淆、使用JavaScript伪协议javascript:alert(1)等。

存储型XSS手动测试:这种更危险,因为恶意脚本被保存到了服务器(如数据库),所有访问特定页面的用户都会中招。测试方法是:在可以持久化数据的地方(如论坛发帖、用户评论、个人资料昵称)提交上述测试载荷,然后以另一个用户身份(或直接刷新页面)查看该内容是否被执行。

注意事项:XSS测试,尤其是在生产环境或未经授权的系统上,是高度敏感且可能违法的行为。弹窗alert(1)是业界公认无害的测试方式,但绝对不要使用alert(document.cookie)或其他可能窃取真实用户信息的载荷进行未经授权的测试。务必在授权的测试环境(如靶场、自己搭建的测试应用)中进行。

2.3 失效的访问控制与逻辑漏洞:信任的滥用

这类漏洞不涉及复杂的技术突破,而是源于业务逻辑设计的缺陷。程序错误地信任了用户提交的信息或未能校验其操作权限。

越权访问测试:

  1. 水平越权:用户A能操作用户B的数据。测试方法:登录一个普通用户A,获取到操作自己资源的API链接或参数(如/api/user/orders/1001,其中1001是订单ID)。然后,在保持登录状态A的情况下,尝试将ID修改为1002(假设这是用户B的订单),访问该链接。如果成功返回或修改了订单1002的详情,则存在水平越权。
  2. 垂直越权:普通用户能执行管理员功能。测试方法:以普通用户身份登录,通过抓包工具拦截一个普通请求。然后,尝试访问仅管理员可见的页面或API端点(如/admin/user/list),或者修改请求中的某个参数(如role=admin)来提升权限。关键在于,不要只看前端UI是否隐藏了按钮,要直接测试后端接口。

业务逻辑漏洞测试:这需要深入理解业务流程。一个经典例子是“无限优惠券”或“支付金额篡改”。

  1. 流程绕过:例如,一个商品购买流程是“加入购物车->填写地址->支付”。测试时,尝试在“填写地址”这一步,抓包并直接跳转到“支付完成”的接口,看是否能绕过支付环节。
  2. 参数篡改:在支付环节,抓取创建订单的请求,里面可能有一个total_amount(总金额)参数。尝试将其修改为一个极小的数值(如0.01元),然后提交请求,观察后端是否真的以这个金额创建了订单。
  3. 竞争条件:在“限量抢购”或“领取唯一优惠券”场景下,同时发起大量并发请求(可以使用Burp Suite的Intruder模块或编写简单Python脚本),尝试突破数量限制。

实操心得:逻辑漏洞的发现极度依赖测试者对业务的理解和“异想天开”的思维。多问自己:“如果我不按正常流程走会怎样?”“如果我把这个参数改成另一个用户/另一个状态/另一个值会怎样?” 工具在这里作用有限,更多的是手工探索和推理。

3. 测试环境搭建与核心工具链

工欲善其事,必先利其器。安全测试不能在生产环境瞎搞,我们需要一个安全的沙盒。同时,一套顺手的工具能极大提升效率。

3.1 测试环境搭建:你的安全沙盒

首选方案:使用集成化漏洞靶场对于初学者和日常练习,这是最安全、最便捷的方式。靶场是预先埋设了各种漏洞的Web应用,专供学习测试。

  • DVWA:Damn Vulnerable Web Application,经典中的经典。漏洞类型全面,难度可调(从Low到Impossible),非常适合入门和教学。
  • bWAPP:另一个非常流行的漏洞练习平台,包含超过100种漏洞,涵盖OWASP Top 10。
  • WebGoat:OWASP官方出品,更像一个交互式的教程,每个漏洞都有详细说明和引导。
  • 部署方法:通常推荐使用Docker一键部署。例如,安装Docker后,只需一条命令docker run -d -p 80:80 vulnerables/web-dvwa即可在本地启动DVWA。这避免了复杂的本地PHP/MySQL环境配置。

进阶方案:搭建本地测试环境如果你想测试自己写的代码,就需要一个隔离的环境。

  1. 虚拟机隔离:使用VirtualBox或VMware创建一台干净的虚拟机(如Ubuntu Server)。
  2. 服务部署:在虚拟机内安装LAMP(Linux, Apache, MySQL, PHP)或类似栈,将你的Web应用代码部署其中。
  3. 网络配置:将虚拟机网络设置为“Host-Only”或“NAT”模式,确保它只与你的宿主机通信,不暴露到外网。
  4. 宿主机测试:在你的宿主机(物理机)上,使用浏览器和测试工具,通过虚拟机的IP地址来访问和测试这个应用。

3.2 核心工具链:渗透测试师的“瑞士军刀”

1. 浏览器开发者工具:你的第一双眼睛现代浏览器(Chrome/Firefox)的F12开发者工具是基础但强大的测试工具。

  • Network面板:记录所有HTTP请求/响应。你可以看到每个请求的详细参数、头部、Cookie。关键用途:重放和修改请求。右键点击任何一个请求,选择“Edit and Resend”,你就可以修改参数后重新发送,用于测试参数篡改、越权等。
  • Console面板:执行JavaScript代码。用于测试DOM型XSS的Payload,或者与页面进行交互。
  • Elements面板:查看和实时编辑HTML DOM。帮助你分析XSS载荷的注入点,查看隐藏的表单字段。

2. 代理抓包工具:流量拦截与操纵的中枢这是手动安全测试的核心工具,它允许你拦截、查看、修改浏览器和服务器之间的所有流量。

  • Burp Suite Community Edition:业界标准,社区版对爱好者完全免费,功能足够入门和中级使用。核心功能包括:
    • Proxy:设置浏览器代理,拦截所有流量。
    • Repeater:将拦截的请求发送到此处,可以反复修改和重放,是测试漏洞的“主战场”。
    • Intruder:用于自动化攻击,如爆破密码、枚举参数、测试竞争条件。
    • Scanner:社区版有基础扫描功能,但较弱,主要用于辅助发现潜在问题。
  • 配置使用:安装Burp后,启动它,在Proxy->Options中确保代理监听(如127.0.0.1:8080)是开启的。然后在浏览器中设置代理为相同的地址和端口。访问http://burp下载并安装Burp的CA证书到浏览器,这样才能拦截HTTPS流量。

3. 漏洞扫描器:自动化的“雷达”扫描器可以快速地对目标进行地毯式搜索,发现常见漏洞的迹象。但务必记住:扫描结果仅供参考,充满误报和漏报,必须手动验证。

  • OWASP ZAP:开源、免费、功能强大,是Burp Suite的有力替代品。它集成了代理、主动/被动扫描、爬虫等功能,对新手友好。
  • Nessus:非常专业的漏洞扫描器,但商业版昂贵。它有强大的漏洞库,能检测操作系统、中间件、数据库的漏洞,而不仅仅是Web应用层。
  • 使用策略:不要一开始就上重型扫描器。建议流程:先用浏览器和手工探索熟悉应用结构 -> 用ZAP进行一遍被动扫描(只分析流量)和主动扫描(对已发现的链接进行测试) -> 对扫描器报告中的“中高危”问题进行重点手工验证。

4. 辅助脚本与扩展

  • sqlmap:开源的自动化SQL注入检测与利用工具。当你手工确认存在SQL注入点后,可以用sqlmap来进一步获取数据(如表结构、数据内容)。警告:仅用于你拥有完全权限的测试目标(如靶场、自己的应用)。
  • 浏览器扩展:如EditThisCookie用于方便地查看和编辑Cookie;Wappalyzer用于快速识别网站使用的技术栈(框架、服务器、数据库等),这对寻找攻击面很有帮助。

4. 实战测试流程:从信息收集到漏洞验证

有了知识和工具,我们来看一个完整的手动测试流程。这个过程是循环迭代的,而非线性的。

4.1 阶段一:侦察与信息收集

在发起任何测试请求之前,先尽可能多地了解目标。

  1. 技术栈识别:使用Wappalyzer扩展或观察HTTP响应头(如ServerX-Powered-By),确定Web服务器(Nginx/Apache/IIS)、后端语言(PHP/Java/Python/.NET)、前端框架(React/Vue)、数据库(通过错误信息推测)等。知道对方用什么,就能推测可能存在的漏洞类型(如IIS可能对应特定的解析漏洞)。
  2. 目录与文件枚举:使用工具(如dirsearch,gobuster)或ZAP的爬虫功能,尝试发现隐藏的目录、备份文件(如.bak,.old)、配置文件(如config.php)、管理后台(如/admin,/wp-admin)等。一个暴露的.git目录可能导致源代码泄露。
  3. 子域名发现:对于大型应用,主站可能防护严密,但测试子域名(如dev.example.com,test.example.com)有时能找到脆弱点。可以使用subfinderamass等工具。
  4. 参数分析:手动浏览应用,用Burp Proxy记录所有流量。关注每一个GET/POST参数、Cookie、HTTP头。思考每个参数的作用和可能的值域。

4.2 阶段二:漏洞探测与手工验证

这是核心阶段,将第一阶段收集的信息用于实际测试。

  1. 针对每个输入点进行测试:对记录到的每一个用户可控输入点,系统性地尝试:
    • SQL注入:使用单引号、逻辑测试(and 1=1,and 1=2)等方法。
    • XSS:输入“><script>alert(1)</script>等测试载荷,观察回显和行为。
    • 命令/代码注入:如果应用有功能调用系统命令(如ping、执行特定脚本),尝试注入分隔符(;,|,&&在Linux,&,|在Windows)和基本命令(如whoami,id)。
    • 路径遍历/文件包含:对于文件读取功能,尝试使用../来跳转目录,如../../../../etc/passwd
  2. 会话与访问控制测试
    • Cookie分析:检查Cookie是否可预测(如简单的用户ID自增)、是否包含敏感信息(如明文用户名、密码哈希)。尝试修改Cookie值,看是否能冒充其他用户。
    • 越权测试:按照2.3节的方法,系统性地测试所有涉及对象ID(用户ID、订单ID、文章ID)的操作。
    • CSRF测试:检查关键操作(如修改密码、转账)的请求是否仅依赖Cookie,而没有随机Token等防护。尝试在另一个浏览器标签页中,直接访问该请求的完整URL(GET方式),或自己构造一个表单页面发起POST请求,看操作是否成功。
  3. 业务逻辑遍历:仔细走查核心业务流程(注册、登录、支付、订单修改、权限申请),寻找任何可以绕过、重复、篡改的环节。

4.3 阶段三:深度利用与影响评估

当确认一个漏洞后,需要评估其真实危害。

  1. SQL注入:不仅仅是证明存在,要尝试利用union查询获取数据库名、表名、列名,最终拖取数据。使用sqlmap可以自动化这个过程,但手动理解过程至关重要。
  2. XSS:证明弹窗后,要构思真实的攻击场景。反射型XSS需要诱骗用户点击链接,可以尝试缩短链接、伪装链接。存储型XSS危害更大,思考脚本能做什么:窃取当前用户的Cookie?发起未经授权的操作(如“关注”攻击者)?模拟点击?
  3. 组合利用:单个漏洞可能危害有限,但组合起来就可怕了。例如,一个简单的信息泄露漏洞(如通过ID遍历看到了其他用户的邮箱)加上一个弱密码策略或密码重置逻辑漏洞,就可能导致账户被批量接管。

4.4 阶段四:报告撰写

测试的最终产出是一份清晰、专业的报告。

  1. 标题:简明扼要,如“在[某功能点]发现SQL注入漏洞”。
  2. 漏洞详情
    • 风险等级:高、中、低(可根据CVSS标准粗略评估)。
    • 漏洞位置:完整的URL、请求方法(GET/POST)。
    • 请求与响应:粘贴存在漏洞的原始HTTP请求和响应数据(可脱敏)。
    • 重现步骤:一步一步,像食谱一样,让开发人员能按照步骤复现漏洞。
    • 漏洞原理:简要说明为什么这是漏洞。
    • 潜在影响:这个漏洞最坏的情况下能导致什么后果(数据泄露、系统沦陷等)。
  3. 修复建议:给出具体、可操作的修复方案。例如,对于SQL注入,明确建议使用“参数化查询(Prepared Statements)”而不是字符串拼接。最好能提供代码示例。

5. 常见问题排查与避坑指南

在实际操作中,你会遇到各种各样的问题。这里记录一些典型的“坑”和解决方法。

5.1 工具使用问题

Burp Suite抓不到HTTPS流量?

  • 问题:浏览器访问HTTPS网站时,Burp里看不到明文请求。
  • 排查:首先确保浏览器代理设置正确指向Burp(如127.0.0.1:8080)。最关键的一步是安装Burp的CA证书
  • 解决:在浏览器中访问http://burp,点击“CA Certificate”下载证书文件。然后进入浏览器的证书管理设置(如Chrome在 设置->隐私和安全->安全->管理证书),在“受信任的根证书颁发机构”中导入该证书。重启浏览器和Burp。

sqlmap跑不出结果?

  • 问题:手工测试怀疑有注入,但sqlmap检测为“未发现注入”。
  • 排查
    1. 请求复现:确保你提供给sqlmap的请求(通过-r参数加载请求文件)是完整且正确的,特别是Cookie和POST数据。
    2. 注入点标记:在请求文件中,用*标记出你想测试的参数位置,如id=1*
    3. 级别与风险:尝试提高检测等级和风险级别:--level=3 --risk=3。等级越高,测试的Payload和参数越多;风险越高,会使用可能造成数据修改的Payload(如OR 1=1)。
    4. 特殊处理:有些网站有复杂的Token或防护机制。可能需要使用--tamper参数调用脚本对Payload进行混淆(如space2comment),或者使用--random-agent来随机化User-Agent。
  • 解决:始终以手工验证为准。sqlmap只是辅助工具,它可能无法识别所有类型的注入,特别是基于时间盲注的复杂情况。

5.2 漏洞验证中的困惑

为什么我的XSS Payload不弹窗?

  • 可能原因1:输入被过滤或编码。查看页面源代码,看你的<script>标签是否被完整保留。可能<>被转义成了&lt;&gt;
  • 可能原因2:执行上下文不对。你的Payload可能被插入到了JavaScript字符串内部、HTML标签属性内部。你需要根据上下文构造合适的Payload来“逃逸”。例如,如果在<input value=“YOUR_INPUT”>里,你需要先闭合双引号:“><script>alert(1)</script>
  • 可能原因3:存在内容安全策略。检查HTTP响应头是否有Content-Security-Policy。CSP会限制脚本执行来源,可能阻止内联脚本(alert)。这种情况下,反射型XSS可能被缓解。

越权测试时,修改ID后返回“权限不足”,是不是就安全了?

  • 不一定。“权限不足”是后端进行了校验的良好标志。但你需要测试所有类似的功能点。有时开发人员会遗漏某个不起眼的接口。另外,注意返回的信息是否过于详细(如“您不是用户12345的所有者”),这本身可能是一种信息泄露,暴露了其他有效ID。

5.3 思维与流程误区

过度依赖自动化工具:这是新手最常见的错误。扫出一个“高危漏洞”就兴高采烈,结果手动一验证发现是误报(比如把版本信息当成漏洞)。或者,工具什么都没扫出来,就认为应用是安全的,却可能遗漏了最致命的业务逻辑漏洞。工具是辅助,人才是核心

测试不全面,浅尝辄止:发现一个注入点就停下来。好的测试者会追问:这个注入点是DBA权限吗?能读写文件吗?能执行系统命令吗?能用来获取其他表的数据吗?深度比广度有时更重要

忽略错误信息:应用程序返回的错误信息是金矿。数据库错误、堆栈跟踪、甚至是自定义的错误提示,都可能泄露路径、技术栈、SQL语句结构等关键信息。在测试时,要故意触发错误,并仔细观察。

在法律和道德边界外测试:这是最严重的问题。未经明确书面授权,对任何不属于你或你未被允许测试的系统进行安全测试,都是非法的,可能构成犯罪。始终在授权的靶场、自己搭建的环境、或通过合法漏洞众测平台(如补天、漏洞盒子等,在获得授权的前提下)进行练习。你的技能应该用于建设和保护,而不是破坏。

安全测试是一条需要持续学习和大量实践的道路。这份指南为你打开了第一扇门,列出了最常见的漏洞和最基本的方法。真正的精通,来自于将这些知识在靶场上反复演练,形成肌肉记忆和条件反射,更来自于培养一种“不信任”的思维模式:不信任任何用户输入,不信任前端校验,不信任看似正常的业务流程。带着这种思维去审视代码和系统,你才能发现那些隐藏在平静表面下的真正风险。

http://www.gsyq.cn/news/1598257.html

相关文章:

  • 高级 RAG 范式:Self-RAG、CRAG、GraphRAG、Agentic RAG 到底解决什么问题?
  • FileBrowser批量下载功能:告别文件管理中的“逐个下载“噩梦
  • 从QStyle到自定义Style:Qt界面定制核心虚函数实战解析与流程图解
  • 30N03-ASEMI中低压大功率通用王者30N03
  • 宜春黄金白银回收铂金旧金回收无套路门店 TOP 榜单 实地测评资料整理
  • 大学物理的规范性作答:从符号表达到数值计算的标准化实践
  • RA8T2外部总线接口配置详解:从时序计算到实战避坑指南
  • 大模型MoE架构原理与实战:专家路由如何实现万亿参数高效推理
  • 如何快速配置AI自动瞄准:面向新手的完整指南
  • IDM激活脚本:让下载管理工具重获新生的3种实用方法
  • 传统时尚只服务年轻群体,编程中老年新中式服饰市场规模预测,测算银发时尚赛道增长潜力。
  • perftest实战:从零到一,精准评估RDMA网络性能
  • Spectator:基于CH32X035的USB PD/QC诱骗器设计与实现
  • 深度剖析CVE-2025-24813:Tomcat反序列化漏洞的源码级攻防实战
  • 【技术回响】从IXI到iPod:数字音频播放器的前世今生与未来畅想
  • Windows字体美化终极方案:No!! MeiryoUI让你的系统界面焕然一新
  • Qt5.15 QWebEngine网页加载超时:从代理到证书链验证的深度排查与优化
  • 狼人杀进阶:从专业术语到实战表水策略全解析
  • Win10任务栏无线网络图标消失了怎么恢复,托盘设置和网卡驱动分步排查
  • GanttProject项目管理的终极指南:掌握任务依赖与资源分配
  • 银川黄金白银回收铂金旧金回收无套路门店 TOP 榜单 实地测评资料整理
  • 从零到一:基于PyTorch与EcapaTdnn构建高精度声纹识别系统
  • 【深度学习】【部署】Flask + PyTorch模型服务化:从API设计到生产环境实践【进阶】
  • N_m3u8DL-RE:免费高效的流媒体下载工具完全指南
  • 广告AI助手设计:从Jarvis执行者到HAL合伙人
  • 朋友圈广告:为什么它能让企业线上获客更简单
  • 云浮高口碑黄金铂金回收白银回收实体老店排行 5 家靠谱门店电话地址全收录
  • 【PHP运维】CentOS 7下通过Remi仓库yum升级至PHP 8.2实战
  • CocosCreator长列表性能优化实战:基于对象池与动态渲染的无尽循环列表实现
  • 3个高效技巧:让Illustrator脚本成为你的设计加速器