1.关于flask的校验jsonify与json.dumps的一些追溯和思考
2.Vite 源码学习3. package.json分析
3.9 个爱不释手的 JSON 工具
4.Laravel 通过 Request 对象的 post() 方法可以获取 JSON 数据的源码分析
5.fastjson 1.2.24源码分析以及漏洞复现
6.cJSON源码解析 - 数据存储方式
关于flask的jsonify与json.dumps的一些追溯和思考
有一天,我遇到了一个服务器报警问题,源码追踪错误栈时,校验发现是源码由于在使用 Flask 的 jsonify 函数时传入的字典中混入了 string 和 int 类型的键导致的。修改数据后,校验我开始思考这一设计背后的源码在线个人读书笔记系统源码逻辑以及为何会如此设定。源码追溯路径指向 JSONDecoder、校验flask.json.__init__.py 及 _dump_arg_defaults。源码分析这部分源码,校验我发现项目使用的源码是继承自 Flask 的 JSONDecoder,稍作修改以兼容如 bson.ObjectId 和 datetime 等数据类型,校验其主体基于标准库中的源码 JSONEncoder。
进一步深入 JSONEncoder 的校验源码,我发现 sort_keys 的源码使用在 JSONEncoder._iterencode_dict 中。此时,校验我开始思考是否可以修改为始终使用默认的 False,以确保 key 为纯字符串。然而,官方为何没有选择这一方案?我开始在 GitHub 上寻找答案,最终在 issue 中找到了线索。在 Python 2 中确实如我所想,但在 Python 3 中,activity源码下载设计发生了改变。大佬们解释了背后的理由。
深入思考后,我倾向于支持 Python 3 的设计选择。首先,明确数据处理逻辑(如是否排序)是至关重要的。这里,我认为 Flask 的默认设置为 False 是个错误,应该与标准库保持一致。其次,确保数据类型的一致性是动态语言的局限性之一,这也是我越来越偏爱 Go 的原因。
从工作角度来看,我得出以下思考:永远不要依赖传入的数据,务必进行验证,尤其是在关键业务中。这不仅是对 Flask 设计的反思,也是对编程实践的提醒,强调了数据验证和明确数据处理逻辑的重要性。
Vite 源码学习3. package.json分析
在Vite项目中,package.json文件起着至关重要的tcpdump源码分析作用,它管理着项目依赖的安装和使用。首先,我们来看看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的jsp源码 宠物运行时工具。
- @pika/react 和 @pika/react-dom: React的兼容包。
- 一连串的@types/*: TypeScript类型定义,确保与各种库的兼容性。
- bootstrap: 常见的前端框架。
- conventional-changelog-cli: 生成项目变更日志。
- cross-env: 跨平台处理环境变量。
- jest: 流行的JavaScript测试框架。
- 一系列的库用于处理CSS、文件操作、日期处理、模板引擎等。
这些库共同构建了Vite项目的开发和运行环境,确保了项目的高效运行和功能实现。通过深入理解package.json,开发者可以更好地管理项目的依赖关系,优化开发流程。后续的开发和维护工作也会围绕这些依赖展开。
9 个爱不释手的 JSON 工具
阅读本文大概需要 3.2 分钟。
来自: developer.cto.com/art...
JSON因其易于使用和机器解析生成而受到开发者青睐,吸引了众多工具构建者的关注。这些工具涵盖了从在线实用程序到代码编辑器和IDE插件,网店推广 源码以下介绍了九款精选JSON工具。
JSONLint:CircleCell开发的在线验证和重新格式化工具,可验证和解析“混乱”的JSON代码,并用作压缩工具。访问:jsonlint.com/,源代码:github.com/circlecell/j...
JSONCompare:CircleCell开发的JSON验证工具,可上传和验证多个批处理JSON文件,比较和合并JSON对象。访问:jsoncompare.com/,源代码:github.com/circlecell/j...
jtc:JSON测试控制台,用于提取、处理和转换源JSON,支持Linux和MacOS编译二进制文件下载。访问:github.com/ldn-softdev/...
ijson:基于Python的迭代JSON解析工具,提供多种实际解析实现,访问:pypi.org/project/ijson/#...
JSON格式化和验证器:在线格式化工具,美化JSON以便阅读和调试,访问:jsonformatter.curiousconcept.com...
Altova XMLSpy JSON和 XML编辑器:提供XML相关技术的编辑、建模、转换和调试工具,访问:altova.com/xmlspy-xml-e...
Code Beautify JSON工具:提供JSON查看器、编辑器、验证器及转换器,还提供在线脚本编辑器、美化器等,访问:codebeautify.org/json-t...
Visual Studio Code:微软代码编辑器,内置支持编辑JSON文件的功能,访问:code.visualstudio.com/D...
Eclipse JSON编辑器插件:面向Eclipse IDE的免费JSON编辑器插件,提供语法高亮、代码折叠、格式化和编辑等功能,访问:marketplace.eclipse.org...
Laravel 通过 Request 对象的 post() 方法可以获取 JSON 数据的源码分析
Laravel通过Request对象的post()方法获取JSON数据的源码分析
在入口文件中,调用Request::capture()方法获取请求对象。
capture()方法进一步调用自身的createFromBase($globals)方法,获取所有请求信息。
createFromBase()方法通过getInputSource()获取所有请求参数。
getInputSource()方法判断请求数据是否为JSON格式。如果是,则直接返回JSON数据;否则返回查询参数或请求体数据。
json()方法对获取的请求内容进行解码,最终返回一个ParameterBag对象,方便开发者进一步操作和使用JSON数据。
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以及类似技术的防御能力。
cJSON源码解析 - 数据存储方式
cJSON通过双向链表结构来组织数据,类似于一棵无序且可嵌套的键值对树。每个节点都有next和prev指针,分别指向其兄弟节点,这样在树中可以通过这些指针轻松查找。只有当节点是对象或数组时,才会存在child指针,用于访问下一层的子节点。
数据的存储方式具体如下:每个节点包含string类型用于存储键名,valuestring、valueint、valuedouble分别对应不同类型的内容。cJSON定义了多种结构类型,每一种类型(如cJSON_Creatxxx)都对应一个cJSON结构实例。
为了更直观地理解数据的组织,考虑以下示例:每个cJSON实例在内存中以这样的形式相连(简化版的图示省略):