4.[ISITDTU 2019]EasyPHP
进入题目页面如下
给出PHP源码进行代码审计
<?php
// 高亮显示当前文件的源代码
highlight_file(__FILE__);// 从 GET 请求中获取名为 '_' 的参数,并将其赋值给变量 $_
// @ 符号用于抑制可能出现的错误信息
$_ = @$_GET['_'];// 使用正则表达式对 $_ 变量的值进行匹配检查
// 正则表达式 /[\x00- 0-9\'"`$&.,|[{_defgops\x7F]+/i 表示匹配 ASCII 码从 0x00 到空格字符、数字 0 - 9、单引号、双引号、反引号、美元符号、& 符号、逗号、点号、竖线、左方括号、左花括号、下划线、字母 d、e、f、g、o、p、s 以及 ASCII 码为 0x7F 的字符
// 如果匹配成功,输出 'rosé will not do it' 并终止脚本执行
if ( preg_match('/[\x00- 0-9\'"`$&.,|[{_defgops\x7F]+/i', $_) )die('rosé will not do it');// 使用 count_chars 函数统计 $_ 变量值中不同字符的数量
// strtolower($_) 将 $_ 变量的值转换为小写
// 0x3 是 count_chars 函数的第二个参数,表示返回一个数组,数组的键是字符的 ASCII 码,值是该字符在字符串中出现的次数
// strlen 函数用于计算这个数组的长度
// 如果数组长度大于 0xd(即十进制的 13),输出 'you are so close, omg' 并终止脚本执行
if ( strlen(count_chars(strtolower($_), 0x3)) > 0xd )die('you are so close, omg');// 如果前面的条件都不满足,使用 eval 函数执行 $_ 变量的值
// eval 函数会将传入的字符串作为 PHP 代码进行执行
eval($_);
?>
代码审计
任意代码执行风险:代码中使用了 eval 函数,并且该函数的输入来自用户通过 GET 请求传递的参数 _。只要用户输入的内容通过了前面的正则表达式和字符数量检查,就会被作为 PHP 代码执行。这是一个非常严重的安全漏洞,攻击者可以利用这个漏洞执行任意 PHP 代码,例如读取敏感文件、执行系统命令、篡改数据库等。
正则表达式过滤不严谨:正则表达式虽然对输入进行了一定的过滤,但仍然可能存在绕过的方法。攻击者可以尝试使用未被过滤的字符组合来构造恶意代码。
字符数量限制可绕过:字符数量的限制可以通过巧妙构造代码来绕过,例如使用重复字符或使用编码技巧来减少不同字符的数量。
这里需要绕过两个if执行命令
if ( preg_match('/[\x00- 0-9\'"`$&.,|[{_defgops\x7F]+/i', $_) )die('rosé will not do it');
// 使用 count_chars 函数统计 $_ 变量值中不同字符的数量
// strtolower($_) 将 $_ 变量的值转换为小写
// 0x3 是 count_chars 函数的第二个参数,表示返回一个数组,数组的键是字符的 ASCII 码,值是该字符在字符串中出现的次数
// strlen 函数用于计算这个数组的长度
// 如果数组长度大于 0xd(即十进制的 13),输出 'you are so close, omg' 并终止脚本执行
正则表达式 /[\x00- 0-9\'"
$&.,|[{_defgops\x7F]+/i` 详细解析
整体结构
是一个使用 preg_match
函数的正则表达式,preg_match
用于在字符串中查找匹配的模式。该正则表达式的目的是检查字符串中是否包含特定范围的字符。
正则表达式整体使用了 /
作为分隔符,结尾的 i
是一个修饰符,表示不区分大小写匹配。
+
是量词,表示匹配前面的字符组一次或多次。
-
字符组
[]
内容分析\x00-
:\x00
表示 ASCII 码为 0 的空字符,这里的-
本意可能是想表示一个范围,但由于后面紧跟空格,它在这里的语义会根据正则表达式引擎的解析规则有所不同,不过一般来说它会被当作普通字符处理。0-9
:表示匹配数字 0 到 9 中的任意一个数字。'
:表示匹配单引号字符。"
:表示匹配双引号字符。`
:表示匹配反引号字符。$
:表示匹配美元符号字符。&
:表示匹配&
符号字符。.
:表示匹配点号字符。,
:表示匹配逗号字符。|
:表示匹配竖线字符。[
:表示匹配左方括号字符。{
:表示匹配左花括号字符。_
:表示匹配下划线字符。defgops
:表示匹配字符d
、e
、f
、g
、o
、p
、s
中的任意一个。\x7F
:表示 ASCII 码为 127 的删除字符。
如果输入的字符串 $_
中包含上述字符组中定义的任意一个或多个字符,preg_match
函数将返回 1
(表示匹配成功),此时代码会执行 die('rosé will not do it');
终止程序并输出错误信息。只有当输入字符串中不包含这些字符时,程序才会继续执行后续代码。
第二个if
if ( strlen(count_chars(strtolower($_), 0x3)) > 0xd )die('you are so close, omg');
// 如果前面的条件都不满足,使用 eval 函数执行 $_ 变量的值
// eval 函数会将传入的字符串作为 PHP 代码进行执行
1. strtolower($_)
strtolower 是 PHP 内置函数,其作用是将字符串中的所有大写字母转换为小写字母。这里将用户输入的字符串 $_ 转换为小写形式,以确保后续统计字符时不区分大小写。
2. count_chars(strtolower($_), 0x3)
count_chars 函数用于统计字符串中每个字符出现的频率,并根据第二个参数指定的返回模式返回结果。
第二个参数 0x3 是十六进制表示,对应的十进制是 3。当 count_chars 函数的第二个参数为 3 时,它会返回一个由字符串中出现过的所有不同字符组成的新字符串,且这些字符按 ASCII 码顺序排列。
所以 count_chars(strtolower($_), 0x3) 会返回一个包含用户输入字符串中所有不同小写字符的新字符串。
3. strlen(count_chars(strtolower($_), 0x3))
strlen 函数用于计算字符串的长度。这里使用 strlen 计算 count_chars(strtolower($_), 0x3) 返回的字符串的长度,也就是用户输入字符串中不同小写字符的数量。
4. strlen(count_chars(strtolower($_), 0x3)) > 0xd
这是一个比较表达式,将计算得到的不同小写字符的数量与十六进制数 0xd(即十进制的 13)进行比较。如果不同小写字符的数量大于 13,则条件为真。
5. die('you are so close, omg');
如果上述比较表达式的结果为真,die 函数会终止当前脚本的执行,并输出 you are so close, omg 作为错误信息。
这里做着没有思路了qyq,去看了大佬的博客,链接如下
BUUCTF:[ISITDTU 2019]EasyPHP_buuctf [isitdtu 2019]easyphp-CSDN博客
大佬用了phpinfo()函数绕过
?_=%8F%97%8F%96%91%99%90
再查看disable_functions
发现有n0t_a_flAg_FiLe_dONT_rE4D_7hIs.txt
最后构造payload
?_=
((%8d%8d%8d%8d%8d%8d%9e%8d)^(%9a%8d%8d%8d%8d%8d%9b%8d)^(%9a%9a%9e%9b%99%96%96%9a)^(%ff%ff%ff%ff%ff%ff%ff%ff))(((%8d%9e%8d)^(%8d%99%8d)^(%9a%96%9b)^(%ff%ff%ff))(((%8d%9e%8d%9e%8d%8d%8d)^(%9a%9b%8d%99%8d%8d%9a)^(%9b%99%9e%96%9b%96%9a)^(%ff%ff%ff%ff%ff%ff%ff))(%d1^%ff)));
最终得到flag
相关文章:
4.[ISITDTU 2019]EasyPHP
进入题目页面如下 给出PHP源码进行代码审计 <?php // 高亮显示当前文件的源代码 highlight_file(__FILE__);// 从 GET 请求中获取名为 _ 的参数,并将其赋值给变量 $_ // 符号用于抑制可能出现的错误信息 $_ $_GET[_];// 使用正则表达式对 $_ 变量的值进行匹配…...
【数学】矩阵、向量(内含矩阵乘法C++)
目录 一、前置知识:向量(一列或一行的矩阵)、矩阵1. 行向量2. 列向量3. 向量其余基本概念4. 矩阵基本概念5. 关于它们的细节 二、运算1. 转置(1)定义(2)性质 2. 矩阵(向量࿰…...
Centos 8 离线升级openssh 9.9
背景 根据云服务漏检报告,需要升级云服务器openssh服务(离线环境)。本文将采用rpm包形式,将openssh服务由OpenSSH_8.0p1 升级至OpenSSH_9.9p1。准备一台能够联网的服务器(简称server1)用于下载程序包&#…...
Java入门进阶
文章目录 1、常用API 1.1、Math1.2、System1.3、Object1.4、Arrays1.5、基本类型包装类 1.5.1、基本类型包装类概述1.5.2、Integer1.5.3、int和String相互转换1.5.4、自动装箱和拆箱 1.6、日期类 1.6.1、Date类1.6.2、SimpleDateFormat类 1.6.2.1、格式化(从Date到…...
torchtext.get_tokenizer
文章目录 1. 说明2. pytorch代码 1. 说明 假设我们有一个句子如下:You can now install TorchText using pip! 分词后可得:[you, can, now, install, torchtext, using, pip, !] 2. pytorch代码 import torchtext from torchtext.data import get_tok…...
零技术开始,但想用 Next.js 基于 React 构建一个类似 18Touch 的网站
如果你从零技术开始,但想用 Next.js 基于 React 构建一个类似 18Touch 的网站,以下是一个详细的规划和学习路径。这个网站看起来是一个内容展示型网站,可能包含博客、产品展示、用户交互等功能。 1. 项目规划 1.1 确定核心功能 根据 18Touc…...
python实现多路视频,多窗口播放功能
系列Python开发 文章目录 系列Python开发前言一、python实现多路视频播放功能二、代码实现1. http申请视频流地址并cv2播放功能 三、打包代码实现生成可执行文件 总结 前言 一、python实现多路视频播放功能 服务端开发后通常需要做功能测试、性能测试,通常postman、…...
设计模式---观察者模式
设计模式—观察者模式 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 主要解决的问题:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,…...
TensorFlow深度学习实战(6)——回归分析详解
TensorFlow深度学习实战(6)——回归分析详解 0. 前言1. 回归分析简介2. 线性回归2.1 简单线性回归2.2 多重线性回归2.3 多元线性回归 3. 构建基于线性回归的神经网络3.1 使用 TensorFlow 进行简单线性回归3.2 使用 TensorFlow 进行多元线性回归和多重线性…...
Deepseek v3R1 学习笔记
o1 o1 模型在训练过程中混合了多种奖励函数的设计方法,并且尝试从结果监督转向过程监督,在中间过程进行打分 使用的搜索策略:基于树的搜索和基于顺序修改的搜索 R1 R1-Zero 是从基础模型开始,完全由强化学习驱动,不…...
Spring Boot统一异常拦截实践指南
Spring Boot统一异常拦截实践指南 一、为什么需要统一异常处理 在Web应用开发中,异常处理是保证系统健壮性和用户体验的重要环节。传统开发模式中常见的痛点包括: 异常处理逻辑分散在各个Controller中错误响应格式不统一敏感异常信息直接暴露给客户端…...
lmk内存压力测试工具mem-pressure源码剖析
背景: android系统开发过程中,经常会遇到一些low memory kill的问题,在分析这些系统低内存导致被杀问题时候,经常因为不好复现而成为一个比较烦恼的阻碍。因为这种低内存问题本身就不属于一种功能操作类型的问题,属于…...
物联网 STM32【源代码形式-ESP8266透传】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】
一、MQTT介绍 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅模式的轻量级通讯协议,构建于TCP/IP协议之上。它最初由IBM在1999年发布,主要用于在硬件性能受限和网络状况不佳的情…...
【大模型】AI 辅助编程操作实战使用详解
目录 一、前言 二、AI 编程介绍 2.1 AI 编程是什么 2.1.1 为什么需要AI辅助编程 2.2 AI 编程主要特点 2.3 AI编程底层核心技术 2.4 AI 编程核心应用场景 三、AI 代码辅助编程解决方案 3.1 AI 大模型平台 3.1.1 AI大模型平台代码生成优缺点 3.2 AI 编码插件 3.3 AI 编…...
Eclipse IDE 快捷键大全
文章目录 简介 ✨常用编辑快捷键 ⌨️基础编辑操作查找和定位代码优化 调试快捷键 🐛编辑器通用快捷键 📝窗口操作快捷键 🪟特殊功能快捷键 🔧重构相关快捷键 🔄提示 💡 简介 ✨ Eclipse 作为一款强大的集…...
ES面试题
1、Elasticsearch的基本构成: (1)index 索引: 索引类似于mysql 中的数据库,Elasticesearch 中的索引是存在数据的地方,包含了一堆有相似结构的文档数据。 (2)type 类型:…...
设置git区分大小写
设置git区分大小写 1.全局设置 (影响全部仓库): git config --global core.ignorecase false2.仓库级别设置 (影响当前仓库): git config core.ignorecase false3.已经提交了大小写不一致的文件处理: git mv -f OldName newName # 强制重命名 git commit -m "Fix cas…...
0205算法:最长连续序列、三数之和、排序链表
力扣128:最长连续序列 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 class Solution {public int longestConsecutive(in…...
VLAN 基础 | 不同 VLAN 间通信实验
注:本文为 “ Vlan 间通信” 相关文章合辑。 英文引文,机翻未校。 图片清晰度限于原文图源状态。 未整理去重。 How to Establish Communications between VLANs? 如何在 VLAN 之间建立通信? Posted on November 20, 2015 by RouterSwi…...
DeepSeek各版本说明与优缺点分析
DeepSeek各版本说明与优缺点分析 DeepSeek是最近人工智能领域备受瞩目的一个语言模型系列,其在不同版本的发布过程中,逐步加强了对多种任务的处理能力。本文将详细介绍DeepSeek的各版本,从版本的发布时间、特点、优势以及不足之处࿰…...
DS图(中)(19)
文章目录 前言一、图的遍历广度优先遍历深度优先遍历 二、最小生成树Kruskal算法Prim算法两种方法对比 总结 前言 承上启下,我们来学习下图的中篇!!! 一、图的遍历 图的遍历指的是遍历图中的顶点,主要有 广度优先遍历 …...
协同探索与导航文献整理
文章目录 1.SOAR:异构无人机协同探索与拍摄以实现快速自主重建2. RACER: 一种使用分散式无人机群进行快速协同探索的方法3. 使用协作式纳米无人机在非结构化环境中进行最小感知探索4.GVP-MREP:通过动态拓扑图上的 Voronoi 分区进行快速且通信高效的多无人机探索5.森林的快速多无…...
排序算法--计数排序
唯一种没有比较的排序(指没有前后比较,还是有交换的)。统计每个元素出现的次数,直接计算元素在有序序列中的位置,要求数据是整数且范围有限。适用于数据为小范围整数(如年龄、成绩),数据重复率较高时效率更优。可用于小…...
吴恩达深度学习——对象检测
内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 对象定位特征点检测基于滑动窗口的目标检测算法原理将全连接层转化成卷积层通过卷积实现滑动窗口检测算法 YOLOBounding Box预测交并比非极大值抑制Anchor BoxYOLO检测训练集中预…...
BUU19 [BJDCTF2020]Easy MD51
题目 当点进去不知道干啥的时候:1.看源代码 2.抓包 3.看网络请求 F12 用bp抓包,在response消息头中有hint提示: select * from admin where passwordmd5($pass,true) 如果md5($pass,true)后是 or 1 那么整句话就是password or 1&a…...
蓝桥杯刷题DAY2:二维前缀和 一维前缀和 差分数组
闪耀的灯光 📌 题目描述 蓝桥公园是一个适合夜间散步的好地方,公园可以被视为由 n m 个矩形区域构成。每个区域都有一盏灯,初始亮度为 a[i][j]。 小蓝可以选择一个大的矩形区域,并按下开关一次,这将使得该区域内每盏…...
HTB:EscapeTwo[WriteUP]
目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…...
vue 引入百度地图和高德天气 都得获取权限
vue接入百度地图---获取ak https://blog.csdn.net/qq_57144407/article/details/143430661 vue接入高德天气, 需要授权----获取key https://www.jianshu.com/p/09ddd698eebe...
AI大模型:DeepSeek
近期DeepSeek产生了很大的影响力。首先来自于性能,给了业内一个很好的释放,缓解了HPC以及大规模集群被卡的焦虑。通过实验证实了小规模团队(公开资料显示规模约150左右)在资源受限的情况下(2M H100 GPU时),依然可以完成对领先大模型的实现与部署。后续观察该团队是否可以…...
LeetCode - #198 打家劫舍
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
从离散傅里叶变换(DFT)到快速傅里叶变换(FFT)
摘要 离散傅里叶变换(DFT)是数字信号处理领域中分析信号频域特性的重要工具,但直接计算DFT的复杂度较高,限制了其在大规模数据处理中的应用。快速傅里叶变换(FFT)的出现显著降低了计算复杂度,极…...
【STM32】HAL库USB虚拟U盘MSC配置及采用自带的Flash作为文件系统
【STM32】HAL库USB虚拟U盘MSC实现配置及采用自带的Flash作为文件系统 本文将自带的Flash作为文件系统 通过配置USB的MSC功能实现虚拟U盘 没有单独建立FATFS文件系统 仅仅是配置USB和Flash读写而已 当然 这里也可以用外部Flash等等 也可以配置文件系统来进行套壳 但总体而言不如…...
Math Reference Notes: 符号函数
1. 符号函数的定义 符号函数(Sign Function) sgn ( x ) \text{sgn}(x) sgn(x) 是一个将实数 ( x ) 映射为其 符号值(即正数、负数或零)的函数。 它的定义如下: sgn ( x ) { 1 如果 x > 0 0 如果 x 0 − 1 如…...
拉格朗日乘数法算法详解Python实现
目录 一、拉格朗日乘数法算法详解1.1 基本思想1.2 数学推导1.3 算法步骤1.4 算法在编程中的实现 二、案例分析案例一:二维最优化问题——求 f ( x , y ) x 2 y 2 f(x,y)x^2y^2 f(x,y)x2y2 在约束 x y 1 xy1 xy1 下的极值2.1.1 问题描述2.1.2 数学模型构建2.1.…...
ip属地是手机号还是手机位置?一文理清
在数字化和网络化的今天,IP属地这一概念逐渐成为了人们关注的焦点。特别是在社交媒体和在线平台上,IP属地的显示往往让人联想到用户的地理位置。然而,关于IP属地到底与手机号还是手机位置有关,却存在着不少误解和混淆。本文将深入…...
C++常用拷贝和替换算法
算法简介: copy // 容器内指定的元素拷贝到另一容器replace // 将容器内指定范围的旧元素改为新元素replace_if // 容器内指定范围满足条件的元素替换为新元素swap //互换两个容器的元素 1. copy 功能描述: 将容器内指定范围的数据拷贝到另一容器中函…...
vue项目搭建
1.准备工作,按照下面的安装一下脚手架vue-cli node16安装vue-cli时报错:需要node>20(但根本就不是版本问题)-CSDN博客文章浏览阅读157次,点赞4次,收藏2次。这种情况我碰到不下5次了,…...
Java进阶面试八股文
1、Java SE和Java EE区别? Java SE 是 Java 的基础版本,Java EE 是 Java 的高级版本。Java SE 更适合开发桌面应用程序或简单的服务器应用程序,Java EE 更适合开发复杂的企业级应用程序或 Web 应用程序。 2、JVM和JRE和JDK区别?…...
Python Django 嵌入 Grafana Dashboard(随手记)
作为一名网络工程师/运维工程师,现在都在往DevOps的方向发展。其中大家都不可避免的会往自己开发平台的方向发展。 那么如何将自己制作的 Grafana 面板 引入到自己的平台上? 一般来说,大家都会选择Python来作为自己开发的语言,并会…...
[Android] IKTV专享版
[Android] IKTV专享版 链接:https://pan.xunlei.com/s/VOILXXuEd3ASo93c88UW79sxA1?pwd4tsw# 2025年2月最新免费K歌神器!家庭KTV软件,手机平板电视盒子电脑都可用...
阿里 Java 岗个人面经分享(技术三面 + 技术 HR 面):Java 基础 +Spring+JVM+ 并发编程 + 算法 + 缓存
技术一面 20 分钟 1、自我介绍 说了很多遍了,很流畅捡重点介绍完。 2、问我数据结构算法好不好 挺好的(其实心还是有点虚,不过最近刷了很多题也只能壮着胆子充胖子了) 3、找到单链表的三等分点,如果单链表是有环的…...
C++多线程编程——call_once和单例模式
目录 1. 前言 2. call_once和once_flag 3. 后记 3.1 单例类的析构问题 3.2 饿汉式单例模式的线程安全问题 1. 前言 之前在讲解单例模式时,有提到懒汉式单例模式使用了双重检测Double-Checked Locking Pattern (DCLP)来解决多线程的安全访问问题。但是该方法也…...
vue2-为啥data属性是一个函数而不是对象
vue2-为啥data属性是一个函数而不是对象 1. data在vue实例和组件中的表现差异 vue实例的时候,data既可以是一个对象也可以是一个函数 new Vue({data:{//对象name:tom},data(){//函数return{name:tom}} })而在组件中定义data,只能是函数,如…...
Spark--算子执行原理
一、sortByKey SortByKey是一个transformation算子,但是会触发action,因为在sortByKey方法内部,会对每个分区进行采样,构建分区规则(RangePartitioner)。 内部执行流程 1、创建RangePartitioner part&…...
keil 单步调试
一、常见错误分析 warningerror警告错误 不影响编译过程 能够输出Hex文件 无法完成编译 不输出Hex文件 注意的是,warning的信息是要去关注的。 下面的UNCALLED SEGMENT除外 二、单步调试配置 1、在keil中添加单片机型号 本文不详细介绍,如有需要可查看这篇文章:...
html的字符实体和颜色表示
在HTML中,颜色可以通过以下几种方式表示,以下是具体的示例: 1. 十六进制颜色代码 十六进制颜色代码以#开头,后面跟随6个字符,每两个字符分别表示红色、绿色和蓝色的强度。例如: • #FF0000:纯红…...
[数据结构] 线性表和顺序表
目录 线性表 顺序表的实现 顺序表各个方法的实现 boolean isFull() -- 判断数组是否放满 : void add(int data) -- 在数组末尾插入新元素 : void add(int pos,int data) -- 在指定位置插入元素 : boolean contain(int toFind) -- 判断是否包含某个元素 int indexOf(in…...
第12章:基于TransUnet和SwinUnet网络实现的医学图像语义分割:腹部13器官分割(网页推理)
目录 1. 前言 2. TransUnet 和 SwinUnet 3. 腹部多器官分割 4. 训练 5. 推理 6. 项目下载 1. 前言 TransUNet 是一种用于医学图像分割的混合架构,结合了 Transformer 和 U-Net 的优势。它利用 Transformer 的全局上下文建模能力和 U-Net 的精确定位特性&…...
DS图(下)(19)
文章目录 前言一、最短路径的概念二、单源最短路径-Dijkstra算法三、单源最短路径-Bellman-Ford算法四、多源最短路径-Floyd-Warshall算法总结 前言 加油,今天就是图的最后一篇了,撑住!! 今天我们要学的就是最短路径问题&…...
鸿蒙Harmony-Progress组件概述
鸿蒙Harmony-Progress组件概述 1.1Progress组件概述 作用:显示操作或任务的进度,支持线性,环形,刻度等多种样式适用场景:文件上传/下载、任务完成度、系统状态反馈等 2.1基础属性(参考官方文档ÿ…...