【远控源码分析】【web源码原理】【光盘打卡源码】json源码讲解

时间:2024-11-30 20:35:31 来源:弘毅投资和源码资本 编辑:mcapture 源码

1.【Vite 源码学习】3. package.json分析
2.Laravel 通过 Request 对象的源码 post() 方法可以获取 JSON 数据的源码分析
3.Unity JSON编码解码 之 LitJson 深度剖析
4.cJSON源码解析 - 数据存储方式
5.ESP32开发解析JSON,这里用cJSON
6.element-plus源码与二次开发:package.json解析

json源码讲解

【Vite 源码学习】3. package.json分析

       在Vite项目中,讲解package.json文件起着至关重要的源码作用,它管理着项目依赖的讲解安装和使用。首先,源码我们来看看dependencies部分,讲解远控源码分析它包含了Vite项目运行时所需的源码第三方库:

       - @babel/parser: Babel JavaScript解释器,用于编译源代码。讲解

       - @rollup/plugin-commonjs: 提供对CommonJS语法的源码支持。

       - @rollup/plugin-json: 解析和处理JSON文件。讲解

       - @rollup/plugin-node-resolve: 负责使用Node的源码模块定位机制,找到依赖的讲解库。

       - @types/*: TypeScript类型定义,源码尽管库本身未用TypeScript编写,讲解但这些类型定义有助于Vite在运行时提供类型支持。源码

       - @vue/compiler-dom: 处理Vue模板编译。

       - @vue/compiler-sfc: 用于Vue底层单文件组件的底层工具。

       同时,还有一些用于优化和压缩的库,如brotli-size用于字符串或Buffer的压缩,clean-css用于快速且高效的CSS优化,debug用于调试,dotenv用于加载环境变量等。

       devDependencies部分则主要为开发环境提供支持:

       - @babel/runtime: Babel的运行时工具。

       - @pika/react 和 @pika/react-dom: React的兼容包。

       - 一连串的@types/*: TypeScript类型定义,确保与各种库的兼容性。

       - bootstrap: 常见的前端框架。

       - conventional-changelog-cli: 生成项目变更日志。

       - cross-env: 跨平台处理环境变量。

       - jest: 流行的JavaScript测试框架。

       - 一系列的库用于处理CSS、文件操作、web源码原理日期处理、模板引擎等。

       这些库共同构建了Vite项目的开发和运行环境,确保了项目的高效运行和功能实现。通过深入理解package.json,开发者可以更好地管理项目的依赖关系,优化开发流程。后续的开发和维护工作也会围绕这些依赖展开。

Laravel 通过 Request 对象的 post() 方法可以获取 JSON 数据的源码分析

       Laravel通过Request对象的post()方法获取JSON数据的源码分析

       在入口文件中,调用Request::capture()方法获取请求对象。

       capture()方法进一步调用自身的createFromBase($globals)方法,获取所有请求信息。

       createFromBase()方法通过getInputSource()获取所有请求参数。

       getInputSource()方法判断请求数据是否为JSON格式。如果是,则直接返回JSON数据;否则返回查询参数或请求体数据。

       json()方法对获取的请求内容进行解码,最终返回一个ParameterBag对象,方便开发者进一步操作和使用JSON数据。

Unity JSON编码解码 之 LitJson 深度剖析

       JSON,即JavaScript Object Notation,是一种轻量级的数据交换格式,它基于ECMAScript标准,以文本形式表示数据,易于人读和机器解析,提高网络传输效率。基本数据类型包括Boolean、Double、Float、Int、Long和String,而Object和Array则作为容器,光盘打卡源码可嵌套其他类型的数据。

       编码(序列化)过程是将编程语言中的数据对象转换为JSON文本,解码(反序列化)则是解析JSON文本,识别数据类型,如识别花括号{ }表示对象,方括号[]表示数组。Unity C#中, LitJson库常用于处理JSON的编码和解码。

       在Unity项目中使用LitJson,步骤简单:首先,将库下载并添加到项目中;然后,定义一个测试数据对象,如GameItem,进行编码和解码操作。编码时,使用JsonMapper的ToJson方法将对象转换为Json String;解码时,通过JsonMapper的ToObject方法将JsonText.txt中的文本解析为JsonData对象,进而访问其中的数据。

       LitJson的核心源码分析,JsonData是其核心数据结构,它以JsonType枚举表示数据类型,存储相应类型的数据。Object和Array分别用Dictionary和List作为容器,通过重载[]操作符和类型强转操作符,实现了灵活的数据访问和转换。JsonWrapper则负责解析JSON字符串,生成对应的Json对象。

cJSON源码解析 - 数据存储方式

       cJSON通过双向链表结构来组织数据,类似于一棵无序且可嵌套的键值对树。每个节点都有next和prev指针,分别指向其兄弟节点,这样在树中可以通过这些指针轻松查找。淘宝post源码只有当节点是对象或数组时,才会存在child指针,用于访问下一层的子节点。

       数据的存储方式具体如下:每个节点包含string类型用于存储键名,valuestring、valueint、valuedouble分别对应不同类型的内容。cJSON定义了多种结构类型,每一种类型(如cJSON_Creatxxx)都对应一个cJSON结构实例。

       为了更直观地理解数据的组织,考虑以下示例:每个cJSON实例在内存中以这样的形式相连(简化版的图示省略):

ESP开发解析JSON,这里用cJSON

       cJSON是什么?

       cJSON是C语言领域中的一款超轻量级JSON解析库。它开源于GitHub,遵循MIT协议,对使用友好。

       与Python的json库、Java的Gson、jackson、fastjson等解析器类似,cJSON同样能解析JSON数据。

       cJSON的源码由一个头文件和一个源文件组成,极为简洁。

       JSON的基本概念:

       JSON对象是无序的键值对集合,以"{ “开始,以”}"结束,允许嵌套使用。

       1. 名称和值成对出现,名称与值之间使用":"分隔。

       2. 键值对之间用","分隔。

       3. 字符前后允许存在无意义的空白符。

       4. 键值可为数组、数字、future任务源码字符串、字面值(false、null、true,需小写)。

       VSCode验证cJSON:

       前提:VSCode已配置C/C++开发环境,插件及编译器设置完成。

       克隆cJSON源码,用VSCode打开。仅需改动vscode的配置文件tasks.json,改动如下图所示。

       配置后,从test.c直接编译,通常不会出现编译错误。

       新增函数测试JSON解析,代码如下:

       运行结果如下:

       IDF中引入cJSON:

       cJSON位于IDF的components\json\cJSON目录下。

       cJSON常用方法概览:

       1. 解析数据:验证JSON格式 > 解析数据 > 释放内存

       2. 创建数据:创建JSON结构体 > 添加数据 > 释放内存

       务必记得释放内存。

       

参考资料:

       ESP学习笔记()--JSON接口使用_esp cjson-CSDN博客

       vscode运行cjson(自用)_vscode c.json-CSDN博客

element-plus源码与二次开发:package.json解析

       element-plus使用pnpm的workspace来搭建monorepo工程,允许在单一码仓库中集中管理大量互相依赖的包,同时确保发布时的独立性。pnpm-workspace.yaml文件在根目录声明内部可引用的包,执行pnpm i后,会在node_modules中创建软连接,无需手动link。

       element-plus组件库将vue声明在peerDependencies中,避免在主项目安装组件库时额外安装vue。通过czg包定义规范,执行提交commit命令,确保遵循git规范。使用play子包进行简单的开发调试,引入本地组件库。通过gen命令快速创建新组件,使用模板生成组件基础模板。生成版本号文件命令用于在构建时提供rollup的banner参数,部署前更新版本号命令从环境变量获取TAG_VERSION和GIT_HEAD,写入到三个包的package.json中的version和gitHead字段。

       清理dist目录命令使用pnpm run -r --parallel,以并行方式执行所有子包的命令,删除根目录下的dist目录,并执行所有子包的clean命令。构建文档和组件库的关键步骤包括使用rollup执行构建,通过@esbuild-kit/cjs-loader将esm和ts实时转换为CommonJS。生成类型声明文件和代码提示文件,复制源样式文件、编译为css、压缩,并输出到特定目录。启动组件库文档docs项目基于vitepress,构建组件文档,本地测试构建出的生产环境docs,生成多语言文件和CROWDIN_TOKEN。

       执行各包的stub命令,使用unbuild打包工具,基于rollup,支持typescript,支持生成commonjs和esmodule和类型声明,无需额外配置。prepare Husky钩子脚本确保自动执行预定义命令,执行pnpm i后,自动执行pnpm stub,编译internal下的三个包入口。

       通过上述详细解析,我们可以清晰了解到element-plus源码与二次开发中的核心功能与流程,从构建结构到构建流程,再到二次开发工具的运用,展示了其高效、灵活的特点。

Unity JSON编码解码之LitJson 深度剖析

       JSON在游戏开发中是一种序列化/反序列化常用的技术,把游戏相关的数据,如地图组成,通过JSON编码,序列化成JSON文本,传输或存储,要使用的时候再通过JSON技术把文本解析成数据对象,在代码中使用。本文将从以下几个方面详细的深度剖析JSON与LitJson库的编码解码:

       对,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀

       (1)什么是JSON;

       (2)Unity如何使用LitJson;

       (3)LitJson核心源码分析;

       1: 什么是JSON

       JSON(JavaScriptObject Notation, JS对象简谱)是一种轻量级的数据交换格式。它是基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。接下来看下JSON格式中定义的数据类型:

       Object: Object在JSON中相当于C#的字典,是一个表,结构为{ key1: v1, key2: v2};

       Array: Array在JSON中相当于C#的List,是一个数组,结构为[v0, v1, v2, …];

       Boolean: Boolean在JSON中相当于C#的boolean;

       Double: Double在json中相当于C#的double;

       Float: Float在json中相当于C# float;

       Int: Int在json中相当于C# int;

       Long: Long在json中相当于C# long;

       String: String在json中相当于C# string;

       2: Unity中如何使用LitJson

       Unity项目中使用LitJson,操作起来也十分简单。接下来我们详细的操作一下,具体步骤如下:

       (1): 创建一个标准的Unity项目,下载LitJson的代码库,我一般会新建一个3rd文件夹,把LitJson的代码库放入到项目中,如图所示:

       (2): 编写一个测试节点,挂一个测试代码,用来测试与讲解LitJson库的使用,同时编写一个JsonText.txt的文本资源,作为测试的Json文本,如图:

       (3): Json编码

       定义一个简单的数据对象GameItem, 如下

       运行结果为:{ "a":,"b":false,"c":,"str":"hello"}, 如下图:

       (4) Json解码

       从JsonText.txt文件里面加载TextAsset资源,或去资源中的文本对象,得到JsonStr, 调用JsonWrapper对象的ToObject方法得到JsonData的数据对象。

       JsonDatajsonObject=JsonMapper.ToObject(jsonTxt.text);

       解析出来jsonObject后,可以根据json中的对象类型来直接访问即可。

       JsonData rst = jsonObject["rst"]; // 子Object对象

       JsonData partnerList = rst["partnerCodeList"]; // 数组对象

       JsonData partner0 = partnerList[0]; // 用数组方式访问

       JsonData可以强转成任意的基本数据类型,string, float, double, boolean, int等。

       3:LitJson核心源码分析

       LitJson使用起来如此简单,那么它是具体怎么实现的呢?接下来我们来分析LitJson源码来学习它代码开发的一些技巧。首先要看下JsonData数据结构,在LitJson内部,每个数据对象都是一个JsonData对象。如图

       JsonData里面包含了一个JsonType type的数据成员,用来表示这个JsonData的数据对象是一个什么样的数据类型。JsonType是一个枚举,正好是所有可能的Json的数据类型,如下:

       如果这个数据类型是一个Boolean,数据值就存放在inst_boolean变量里面,如果数据类型是一个string, 数据值就存放在inst_string变量里面。

       在JSON中,Object与Array是容器,所以在JsonData里面分别用Dictionary与List来作为Object与Array的容器,容器中的每个元素又是一个JsonData,所以就实现了容器中可以有容器对象+数据对象。

       JsonData中重载了[]操作符,方便容器对象来取数据,如图所示:

       Object 容器对象[key]操作重载

       数组容器对象的[index]操作重载

       JsonData中重载了类型强转操作符,让我们能直接通过强转Json来获取基本的数据:

       Int, Float, Double, Boolean, String。如图:

       通过强转基本数据到JsonData,来获取JsonData, 如图:

       这样非常方便的让我们生成了JsonData,非常方便的能通过JsonData获取数据。

       JsonWrapper来解析Json字符串的时候,就是读取文本内容,来根据对应的Token符号来生成对应的Json对象,具体可以阅读源码:

       今天的JSON与LitJson的分析就到这里了。

fastjson 1.2.源码分析以及漏洞复现

       反序列化,这个过程将字节序列恢复为Java对象。例如在使用Python做自动化测试时,通过字符串名字调用相同名字的方法。Fastjson的功能允许通过字符串引用如`@type":"com.sun.rowset.JdbcRowSetImpl`来执行内部方法。由此,我们能利用Fastjson提供的便利,通过调用对应的函数来验证漏洞。

       在渗透测试中,漏洞的验证通常需要满足几个条件:判断指纹和指纹回显,Fastjson的特性使得这一步变得简单。然而,在利用过程中,要考虑到Fastjson本身的限制、JDK的限制以及可能的安全配置限制。因此,POC验证方案需考虑这些限制的版本和配置。

       Fastjson通过JSON抽象类实现JSONAware接口,并提供两个常用方法:`toJSONString`用于对象转换为JsonString,`parseObject`用于将JSON字符串转换为对象。这次的漏洞主要与反序列化相关。

       反序列化的执行发生在`DefaultJSONParser.java`类中。关键代码中,固定键`@type`对应反序列化类的全路径,其中`typeName`为传入类的全路径。在Fastjson 1.2.版本中,`loadClass`方法未进行任何过滤,允许传入任何JVM加载的类,并执行`setKey`方法,其中Key为可变参数。

       要利用这个反序列化漏洞,需要满足以下条件:JVM加载的类、有非静态set方法和传入一个参数。使用RPC远程执行代码的思路实现POC,此处使用了`com.sun.rowset.JdbcRowSetImpl`实现。

       JNDI全称为Java Naming and Directory Interface,主要提供应用程序资源命名与目录服务。其底层实现之一是RMI(Remote Method Invocation),用于Java环境的远程方法调用。在`com.sun.rowset.JdbcRowSetImpl`类中,关注点在于`getDataSourceName()`和`setAutoCommit()`方法。`getDataSourceName()`用于传值,`setAutoCommit()`用于确认调用set方法。

       实现过程包括引用`com.sun.rowset.JdbcRowSetImpl`类、设置`dataSourceName`传值以及通过`autoCommit`属性触发执行方法。完成方法确认后,使用`marshalsec`项目启动RMI服务并加载远程类。

       POC的实现步骤如下:首先确认目标是否使用Fastjson且存在漏洞;利用Fastjson的反序列化功能传输引用类和执行方法;使用`com.sun.rowset.JdbcRowSetImpl`执行验证POC的脚本,并观察回显结果;最后,完成漏洞利用。

       具体操作包括搭建环境,如使用CentOS虚拟机作为RMI服务器和远程调用服务,KALI机器作为靶机和抓包测试。进行指纹确认、安装maven、构建RMI服务器和客户端、调用测试文件,并观察DNS日志以验证漏洞成功利用。通过DNS日志确认漏洞利用成功后,可以进一步尝试反弹shell,实现远程控制。

       综上所述,Fastjson的反序列化漏洞是一个可以被利用的安全问题,通过合理的利用,可以实现远程代码执行。了解和研究这类漏洞有助于增强对Fastjson以及类似技术的防御能力。

copyright © 2016 powered by 皮皮网   sitemap