序列化

python3--json与pickle数据序列化

此生再无相见时 提交于 2020-03-06 12:49:06
必读:json和pickle 可以多次jumps, 1、json适合处理简单数据,可以跨语言、跨文件; 基本方法:(比较low的方法序列化用str转换,反序列化用eval;) import json #数据序列化 info = {"name":"bokeyuan"} f = open("test.txt","w") f.write(json.dumps(info)) f.close #数据反序列化 f = open("test.txt","r") data = json.loads(f.read()) print(data["name"]) f.close 2、pickle适合处理复杂数据(如:函数),但是只能在本语言使用(python),其它语言不识别pickle数据; 基本方法: import pickle #数据序列化 info = {"name":"bokeyuan"} f = open("test.txt","w") f.write(pickle.dumps(info)) f.close //////////////////////////////////////////////////////////////////// #数据序列化的另外一个方法 info = {"name":"bokeyuan"} f = open("test.txt","w") pickle

Java序列化接口的作用总结

元气小坏坏 提交于 2020-03-06 07:45:26
一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做”持久化”. 把堆内存中的对象的生命周期延长,存入硬盘,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从硬盘中读取就可以了.(存储到硬盘是一个文件,不需要我们去解析,如果用记事本打开解析会出现乱码,解析要用特定的方式,不用我们管. 我们只需要读取). 把对象存储到硬盘上的一个文件中,这个文件的标准扩展名是(.object). 在很多框架中就会有这种.object结尾的文件,因为很多对象都不创建,创建起来太麻烦,直接读取,而且有些对象的值你不知道,框架封存在.object文件中,直接读取这个文件中的这个值就行了,不需要传这个值. 1 import java.io.Serializable; 2 /* 3 * Serializable:用于给被序列化的类加入ID号。 4 * 用于判断类和对象是否是同一个版本。 5 */ 6 public class Person implements Serializable/*标记接口*/ { 7 /** 8 * transient:非静态数据不想被序列化可以使用这个关键字修饰。 9 */ 10 private static final long serialVersionUID = 9527l; 11 // private transient String name; 12

大数据技术之Hadoop之MapReduce(2)——Hadoop序列化

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-06 01:26:46
第2章:Hadoop序列化 2.1 序列化概述 2.1.1什么是序列化 序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化)和网络传输。 反序列化就是将收到字节序列(或其他数据传输协议)或者是磁盘的持久化数据,转换成内存中的对象。 2.1.2为什么要序列化 一般来说,“活的”对象只生存在内存里,关机断电就没有了。而且“活的”对象只能由本地的进程使用,不能被发送到网络上的另外一台计算机。 然而序列化可以存储“活的”对象,可以将“活的”对象发送到远程计算机。 2.1.3 为什么不用Java的序列化 Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,Header,继承体系等),不便于在网络中高效传输。所以,Hadoop自己开发了一套序列化机制(Writable)。 Hadoop序列化特点: (1)紧凑 :高效使用存储空间。 (2)快速:读写数据的额外开销小。 (3)可扩展:随着通信协议的升级而可升级 (4)互操作:支持多语言的交互 2.2 自定义bean对象实现序列化接口(Writable) 在企业开发中往往常用的基本序列化类型不能满足所有需求,比如在Hadoop框架内部传递一个bean对象,那么该对象就需要实现序列化接口。 具体实现bean对象序列化步骤如下7步。 (1

java反序列化-ysoserial-调试分析总结篇(6)

谁说我不能喝 提交于 2020-03-05 22:57:36
前言: 这篇记录CommonsCollections6的调试,外层也是新的类,换成了hashset,即从hashset触发其readObject(),yso给的调用链如下图所示 利用链分析: 首先在hashset内部首先获取器容量与负载因子等操作,然后创建hashmap,将ObjectinputStream中的对象放到hashmap中,即调用hashmap.put函数,可以看到此时实际上放进去的是一个TiedMapEntry,TiedMapEntry是cc5加入进去的一个Map类,其getvalue函数能够获取指定map的key,所以跟进 hashMap在放入元素时将会对当前的key计算一个hash值,即这里调用hashCode()函数,所以即调用TiedMapEntry的hashCode()函数,在hashCode函数中将调用该类的getvalue函数, 所以从此刻开始就和CommonsCollections5的后续利用链相同了,因为CC5是在该类的toString中调用getvalue 接着就跳到this.map.get(this.key),此时this.map即为lazymap.get 在lazymap.get中将调用this.factory.transform,而我们知道this.factory是可控的,这里依然为chaindTransform

刷题记录:[V&N2020 公开赛]EasySpringMVC

℡╲_俬逩灬. 提交于 2020-03-05 22:45:18
题目复现链接: https://buuoj.cn/challenges 参考链接: 2020 年 V&N 内部考核赛 WriteUp 从一道题入门JAVA反序列化漏洞 V&N公开赛2020 writeup Java反序列化 深入了解序列化writeObject、readObject、readResolve 总结一下,如果目标类中没有定义私有的writeObject或readObject方法,那么序列化和反序列化的时候将调用默认的方法来根据目标类中的属性来进行序列化和反序列化,而如果目标类中定义了私有的writeObject或readObject方法,那么序列化和反序列化的时候将调用目标类指定的writeObject或readObject方法来实现。 这里的Tools类中有 readObject , private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { Object obj = in.readObject(); (new ProcessBuilder((String[])((String[])obj))).start(); } 其实这就是一个后门。我们可以重写Tools类中 writeObject 来生成payload private void

Java序列化

青春壹個敷衍的年華 提交于 2020-03-05 22:03:03
一、java中的序列化 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。把Java对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为Java对象的过程称为对象的反序列化。 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 2) 在网络上传送对象的字节序列。 JDK类库中的序列化API ObjectOutputStream //代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。 ObjectInputStream //代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。 只有实现了Serializable和Externalizable接口的类的对象才能被序列化。 Externalizable接口继承自Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以采用默认的序列化方式 对象序列化包括如下步骤: 1) 创建一个对象输出流

drf序列化组件实现十大接口

孤街醉人 提交于 2020-03-05 20:39:53
目录 序列化字段了解配置 response二次封装 连表深度查询 单查群查 单增群增 单删群删 整体单改群改 局部单改群改 序列化字段了解配置 了解配置: fields = '__all__' exclude = ['name'] 排除name字段 depth = 2 自动深度,值代表深度次数,但是被深度的外键采用__all__,显示所有字段 response二次封装 from rest_framework.response import Response class APIResponse(Response): def __init__(self, status=0, msg='ok', results=None, http_status=None, headers=None, exception=False, content_type=None, **kwargs): # 将status、msg、results、kwargs格式化成data data = { 'status': status, 'msg': msg, } # results只要不为空都是数据:False、0、'' 都是数据 => 条件不能写if results if results is not None: data['results'] = results # 将kwargs中额外的k-v数据添加到data中

DRF序列化组件实现十大接口

冷暖自知 提交于 2020-03-05 20:39:27
目录 基表的概念 表关系的建立 DRF中Response类二次封装 连表查询 depth配置查询深度 插拔式自定义序列化字段连表查询 子序列化 实现十大接口 单查群查 单删群删 单增群增 整体单改群改 局部单改群改 基表的概念 abstract = True # 基表 class BaseModel(models.Model): is_delete = models.BooleanField(default=False) create_time = models.DateTimeField(auto_now_add=True) class Meta: # 基表,抽象类 abstract = True class Book(BaseModel): pass class Publish(BaseModel): pass 表关系的建立 通常我们在实际开发项目中我们的数据库各种表是不建立外键关联表的,是为什么呢? 因为我们在建立了外键关系之后,随着业务发展,表越来越多,外间关系越来越复杂,假如有一天表字段可能有问题,需要重构什么的,需要删除掉,那会发现删不掉了,因为和其他很多表都建立了外键关系,这时候我们的数据库断开关联表关系的优点就体现出来了: 断关联表不会影响连表的查询操作 还有助于提升连表增删改操作的效率 最重要的一点是方便后期的扩展与重构 那么他的缺点就是数据库本身没有连表的检测

Java面试题收集学习整理1

家住魔仙堡 提交于 2020-03-05 06:24:28
1、java序列化、反序列化及serialVersionUID作用 把Java对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为Java对象的过程称为对象的反序列化。对象的序列化主要有两种用途: 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 在网络上传送对象的字节序列。 凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量: private static final long serialVersionUID; 默认值完全依赖于Java编译器的实现,对于同一个类,用不同的Java编译器编译,有可能会导致不同的serialVersionUID,也有可能相同。为了提高serialVersionUID的独立性和确定性,强烈建议在一个可序列化类中显示的定义serialVersionUID,为它赋予明确的值。Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。 serialVersionUID 用来表明类的不同版本间的兼容性。有两种生成方式: 一个是默认的1L,比如:private

typecho反序列化漏洞

本小妞迷上赌 提交于 2020-03-05 01:28:54
漏洞介绍 Typecho是一个简单,轻巧的博客程序。基于PHP,使用多种数据库(Mysql,PostgreSQL,SQLite)储存数据。在GPL Version 2许可证下发行,是一个开源的程序,目前使用SVN来做版本管理 漏洞形成 由于源码的以下几行存在反序列化漏洞与逻辑绕过,形成漏洞 漏洞利用 思路: 由于install.php代码验证了finish参数,请求头HTTP_HOST,post数据__typecho_config,所以我们要加上这几个参数进行绕过 1.添加install.php?finish参数 http://localhost/typecho/install.php?finish=1 2.添加Referrer数据头为本地 http://localhost 3.添加post值__typecho_config=脚本运行得到的攻击代码 代码: