序列化

PHP之序列化与反序列化讲解

独自空忆成欢 提交于 2020-03-12 11:44:08
serialize() 把变量和它们的值编码成文本形式 unserialize() 恢复原先变量 eg: $stooges = array('Moe','Larry','Curly');$new = serialize($stooges);print_r($new);echo "<br />";print_r(unserialize($new)); 结果: a:3:{i:0;s:3:"Moe";i:1;s:5:"Larry";i:2;s:5:"Curly";} Array ( [0] => Moe [1] => Larry [2] => Curly ) 当把这些序列化的数据放在URL中在页面之间传递时,需要对这些数据调用urlencode(),以确保在其中的URL元字符进行处理: $shopping = array('Poppy seed bagel' => 2,'Plain Bagel' =>1,'Lox' =>4);echo '<a href="next.php?cart='.urlencode(serialize($shopping)).'">next</a>'; margic_quotes_gpc和magic_quotes_runtime配置项的设置会影响传递到unserialize()中的数据。 如果magic_quotes_gpc项是启用的,那么在URL

Fastjson反序列化漏洞利用分析

点点圈 提交于 2020-03-12 11:16:45
Fastjson反序列化漏洞利用分析 ​ 背景 在推动Fastjson组件升级的过程中遇到一些问题,为帮助业务同学理解漏洞危害,下文将从整体上对其漏洞原理及利用方式做归纳总结,主要是一些概述性和原理上的东西。 漏洞原理 多个版本的Fastjson组件在反序列化不可信数据时会导致代码执行。究其原因,首先,Fastjson提供了autotype功能,允许用户在反序列化数据中通过“@type”指定反序列化的类型,其次,Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,若指定类的指定方法中有可被恶意利用的逻辑(也就是通常所指的“Gadget”),则会造成一些严重的安全问题。 那么不开启autotype功能就安全了吗? 不是的,在Fastjson 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过,绕过细节可参考(https://www.anquanke.com/post/id/181874),代码验证逻辑的问题,不再赘述。 利用方式 那么Fastjson反序列化不可信数据时是如何导致代码执行的呢?这就是漏洞原理一节中所说的可被恶意利用的逻辑,目前公开的

11 序列化类的其他配置

佐手、 提交于 2020-03-12 08:55:30
fields配置了需要进行序列化和反序列化字段,除了fields之外还有其他一些不常用的配置 class AuthorModelSerializer(serializers.ModelSerializer): class Meta: model = models.Author # 不常用,将全部字段提供给外界 fields = '__all__' # ------------------------------------------------------------------ class AuthorModelSerializer(serializers.ModelSerializer): class Meta: model = models.Author # 不常用,排除指定字段的其他所有字段,不能自动包含 外键反向 字段 exclude = ['is_delete', 'updated_time'] # ------------------------------------------------------------------ class AuthorModelSerializer(serializers.ModelSerializer): class Meta: model = models.Author # 'detail', 'books' 是 外键(正向

[Java]序列化和反序列化

寵の児 提交于 2020-03-12 04:29:03
序列化和反序列化 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。  对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 2) 在网络上传送对象的字节序列。 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。 来源: https://www.cnblogs.com/lkboy/p/4242710.html

《设计模式》——迪米特法则

拥有回忆 提交于 2020-03-11 10:07:25
定义   其实《设计模式之禅》关于原则的部分,我最喜欢的就是《迪米特法则》没什么特殊原因,前段时间部门培训,让我出个培训内容,就是选择的迪米特法则。其实原因很简单,就因为看它名字都不知道究竟是拿来干啥的。 先臭美一下 《设计模式》——目录 ,然后让我们进入正题。   所以究竟什么是迪米特法则呢?   迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP),虽然名字不同,但描述的是同一个规则:一个对象应该对其他对象有最少的了解。通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的这么多public方法,我就调用这么多,其他的我一概不关心。   对于这个定义说实话我还是挺喜欢的,但也是生活中我很难做到的一点,那就是“我就调用这么多,其他的我一概不关心”。其实在小的公司,这样的性格是不好的,毕竟很难做到一个萝卜一个坑,大家或多或少都需要承担一些职能外的任务。而且从个人成长的角度来说,其实也是参与越多,收获也会越多。    有感一段废话,可以跳过不看。职场中有一种情况,那就是A只做十件事,而且十件事都完成的很好;而B需要做一百件事,但是有一件事没有做好。这两个人谁的年终评估会更高一些呢?当然,这里不是劝大家“各人自扫门前雪

1227 十大接口使用,Response封装深度查询

荒凉一梦 提交于 2020-03-11 09:12:40
目录 十大接口 1.序列化了解配置 2.Response的二次封装 3.深度查询 3.1 子序列化: 3.2 配置depth 3.3 插拔式@property 4. 十大接口实现 4.1 单查群查(get) 4.2 单删群删(delete) 4.3 单增群增(post) 4.4 整体单改群改(put) 4.5 局部单改群改(patch) 新中国前夕 十大接口 1.序列化了解配置 fields = __all__ 将所对应类中的所有名成空间 exclude = [' ',] , 排除某一字段,其他的需要 depth = 1 查询的深度设置(遇到外键就找深度查询) 外键字段默认显示的是外键值(int类型,不会自己进行深度查询) 2.Response的二次封装 自定义Response的封装,将数据返回自定义使用 from .response import APIResponse class BookAPIView(APIView): def get(self,request,*args,**kwargs): book_query = models.Book.objects.all() # 序列化模块 book_ser = serializers.BookModelSerializer(book_query,many=True) # 原先的返回数据 # return Response( #

导包补充,深度查询(深度序列化),十大接口

百般思念 提交于 2020-03-11 09:12:02
目录 一、导包补充 二、深度查询 1. 子序列化和 depth方法 (1)什么是子序列化 (2) __all__ 方法 exclude方法 (3)子序列化实例 2. 插拔式 三、十大接口 1. 十大接口中注意点(很重要) 2. 实例 一、导包补充 在导包时,如果用 from 文件1 import * ,则文件1中的以下划线开头的变量,都不能访问。无论是单下划线还是双下线。 用 import 文件1 的方式,还是能访问到文件1中以下划线开头的变量,没有影响。 当我们用 from 文件1 import * 的方式导包时,怎么才能访问到其中以下划线开头的变量呢,解决方法如下 # 解决方法: 使用 __all__方法将下划线开头的变量储存。 # __all__本来就默认包含普通的变量,所以自己重写__all__时,要把普通变量也加上 # 例子 # 文件1中: x = 10 _y = 20 __z = 30 __all__ = ['x','_y','__z'] # 文件2中 from 文件1 import * print(x, _y, __z) # 结果: 10 20 30 二、深度查询 深度查询主要是用在:当给前端数据时,要求带有与当前表有关联的其他表的某些数据。通过连表操作,将关联表中的数据一起序列化 外键字段默认显示的是外键值(int类型),不会自己进行深度查询

Json序列化,date类型转换后前端显示错误的解决方案

走远了吗. 提交于 2020-03-11 08:53:44
1.前台使用Jquery解决   (1)如果我们前台使用Jquery来解决这个问题的话,那么我们首先想到的是我们如何解析这个过程呢,当然我们就想到了自己写一个JavaScript脚本来解析这个过程,当然这个脚本不是我写的了,而是别人写的,自己拿过来用,脚本代码如下: 1 //by 韩迎龙 2 3 /** 4 5 * 对Date的扩展,将 Date 转化为指定格式的String 6 7 * 月(M)、日(d)、12小时(h)、24小时(H)、分(m)、秒(s)、周(E)、季度(q) 可以用 1-2 个占位符 8 9 * 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字) 10 11 * eg: 12 13 * (new Date()).pattern("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423 14 15 * (new Date()).pattern("yyyy-MM-dd E HH:mm:ss") ==> 2009-03-10 二 20:09:04 16 17 * (new Date()).pattern("yyyy-MM-dd EE hh:mm:ss") ==> 2009-03-10 周二 08:09:04 18 19 * (new Date()).pattern("yyyy-MM

java ArrayList的序列化分析

僤鯓⒐⒋嵵緔 提交于 2020-03-11 08:27:26
一、绪论 所谓的JAVA序列化与反序列化,序列化就是将JAVA 对象以一种的形式保持,比如存放到硬盘,或是用于传输。反序列化是序列化的一个逆过程。 JAVA规定被序列化的对象必须实现java.io.Serializable这个接口,而我们分析的目标ArrayList同样实现了该接口。 通过对ArrayList源码的分析,可以知道ArrayList的数据存储都是依赖于 elementData数组,它的声明为: transient Object[] elementData; 注意transient修饰着elementData这个数组。 1、先看看transient关键字的作用 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。 然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上 transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化

jwt token认证

北慕城南 提交于 2020-03-11 07:02:36
目录 1、drf-jwt手动签发与校验 2、drf小组件:过滤、筛选、排序、分页 => 针对与群查接口 jwt_token源码分析(入口) 签发token源码分析 校验token源码分析 手动签发token 签发源码小总结: 手动校验token 校验源码小总结 1、drf-jwt手动签发与校验 2、drf小组件:过滤、筛选、排序、分页 => 针对与群查接口 jwt_token源码分析(入口) rest_framework_jwt --> views.py --> ObtainJSONWebToken(JSONWebTokenAPIView) class ObtainJSONWebToken(JSONWebTokenAPIView): serializer_class = JSONWebTokenSerializer 然后到父类中JSONWebTokenAPIView的post方法 def post(self, request, *args, **kwargs): #从get_serializer获取serializer serializer = self.get_serializer(data=request.data) ........ 点击get_serializer def get_serializer(self, *args, **kwargs):