如何用JavaScriptSerializer
一、
JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据。您无法访问序列化程序的此实例。但是,此类公开了公共 API。因此,当您希望在托管代码中使用 JavaScript 对象符号 (JSON) 时可以使用此类。
若要序列化对象,请使用 Serialize 方法。若要反序列化 JSON 字符串,请使用 Deserialize 或 DeserializeObject 方法。若要序列化和反序列化 JavaScriptSerializer 本身不支持的类型,请使用 JavaScriptConverter 类来实现自定义转换器。然后,使用 RegisterConverters 方法注册转换器。
托管类型和 JSON 之间的映射
下表显示序列化进程中托管类型和 JSON 之间的映射。JavaScriptSerializer 本身支持这些托管类型。将 JSON 字符串反序列化为托管类型时,采用相同的映射。但是,反序列化可能是非对称的,并非所有可序列化的托管类型都可以从 JSON 反序列化得到。
二、
通过JavaScriptSerializer来实现。它的名字空间为:SystemWebScriptSerialization
如果要使用它,还须添加
SystemWebExtensions库文件引用
参考实体类:Customer
public class Customer
{
public int Unid { get; set; }
public string CustomerName { get; set; }
}
类JavaScriptSerializer描述:为启用 AFAX 的应用程序提供序列化和反序列化功能。
(一) 序列化
方法:public string Serialize(Object obj),用于将对象转换为 JSON 字符串
public string ScriptSerialize(Customer customer)
{
JavaScriptSerializer js = new JavaScriptSerializer();
return jsSerialize(customer);
}
测试:
Customer cc = new Customer { Unid = 1, CustomerName = "John" };
string strJson = ScriptSerialize(cc);
ConsoleWriteLine(strJson);
(二)反序列化
public Customer ScriptDeserialize(string strJson)
{
JavaScriptSerializer js = new JavaScriptSerializer();
return jsDeserialize<Customer>(strJson);
}
通过Deserialize<T>方法来实现。
测试:
Customer c1 = ScriptDeserialize(strJson);
ConsoleWriteLine(c1Unid + " " + c1Custome
outprintln(path);
%>
使用浏览器访问上述jsp文件,可以看到对应的类所在的jar包的完整路径。
通过上述方法查找“orgapachecommonscollectionsmapTransformedMap”所在的jar包,示例如下。
不同版本的weblogic对Apache Commons Collections组件的使用
“orgapachecommonscollectionsmapTransformedMap”所在的weblogic的jar包信息如下。
weblogic版本
TransformedMap类所在jar包路径
92
无
1021(weblogic 10g)、1034(weblogic 11g)
weblogic安装目录的modules/combeacoreapachecommonscollections_320jar
1213(weblogic 12c)
weblogic安装目录的wlserver/modules/features/weblogicservermergedjar
由于weblogic 92未包含TransformedMap类,因此无法触发反序列化漏洞,weblogic 10g、weblogic 11g、weblogic 12c均包含TransformedMap类,因此会触发反序列化漏洞。
0x04 漏洞修复
漏洞修复思路
weblogic的默认服务端口为7001,该端口提供了对HTTP(S)、SNMP、T3等协议的服务。由于weblogic的不同协议均使用一个端口,因此无法通过防火墙限制端口访问的方式防护JAVA反序列化漏洞。
在绝大多数应用的使用场景中,用户只需要在公网能够使用HTTP(S)协议访问web应用服务器即可。对于weblogic服务器,在绝大多数情况下,只需要能够在公网访问weblogic提供的HTTP(S)协议的服务即可,并不需要访问T3协议。
少数情况下,运维人员需要使用weblogic的T3协议:
在weblogic服务器本机执行weblogic的停止脚本;
通过WLST对weblogic进行脚本化配置;
编写使用T3协议通信的程序对weblogic进行状态监控及其他管理功能。
T3协议与HTTP协议均基于TCP协议,T3协议以"t3"开头,HTTP协议以“GET”、“POST”等开头,两者有明显的区别。
因此可以限定只允许特定服务器访问weblogic服务器的T3协议,能够修复weblogic的JAVA反序列化漏洞。即使今后发现了weblogic的其他类存在JAVA反序列化漏洞,也能够防护。
若将weblogic修复为发送T3协议时要求发送weblogic的用户名与密码,也能够修复weblogic的反序列化问题,但会带来密码如何在weblogic客户端存储的问题。
无效的漏洞修复方法
首先尝试将应用部署到非管理Server中,判断其服务端口是否也提供T3协议的服务。
AdminServer是weblogic默认的管理Server,添加一个名为“Server-test”的非管理Server后,weblogic的服务器信息如下。管理Server与非管理Server使用不同的监听端口,可将j2ee应用部署在非管理Server中,这样可以使weblogic控制台与应用使用不同的端口提供服务。
经测试,新增的非管理Server的监听端口也提供了T3协议的服务,也存在JAVA反序列化漏洞。因此这种修复方式对于JAVA反序列化漏洞无效,但可将weblogic控制台端口与应用端口分离,可以使用防火墙禁止通过公网访问weblogic的控制台。
websphere的服务端口
我们来看另一款使用广泛的企业级JAVA中间件:websphere的服务端口情况。从下图可以看到,websphere的应用默认HTTP服务端口为9080,应用默认HTTPS服务端口为9443,控制台默认HTTP服务端口为9060,控制台默认HTTPS服务端口为9043,接收JAVA序列化数据的端口为8880。因此只要通过防火墙使公网无法访问websphere服务器的8880端口,就可以防止通过公网利用websphere的JAVA反序列化漏洞。
网络设备对数据包的影响
对安全有一定要求的公司,在部署需要向公网用户提供服务的weblogic服务器时,可能选择下图的部署架构(内网中不同网络区域间的防火墙已省略)。
上述网络设备对数据包的影响如下。
IPS
IPS可以更新防护规则,可能有厂家的IPS已经设置了对JAVA反序列化漏洞的防护规则,会阻断恶意的JAVA序列化数据包。
防火墙
这里的防火墙指传统防火墙,不是指下一代防火墙,仅关心IP与端口,不关心数据包内容,无法阻断恶意的JAVA序列化数据包。
WAF
与IPS一样,能否阻断恶意的JAVA序列化数据包决定于防护规则。
web代理
仅对HTTP协议进行代理转发,不会对T3协议进行代理转发。
负载均衡
可以指定需要进行负载均衡的协议类型,安全起见应选择HTTP协议而不是TCP协议,只对HTTP协议进行转发,不对T3协议进行转发。
根据以上分析可以看出,web代理和负载均衡能够稳定保证只转发HTTP协议的数据,不会转发T3协议的数据,因此能够防护JAVA反序列化漏洞。
如果在公网访问weblogic服务器的路径中原本就部署了web代理或负载均衡,就能够防护从公网发起的JAVA反序列化漏洞攻击。这也是为什么较少发现大型公司的weblogic反序列化漏洞的原因,其网络架构决定了weblogic的JAVA反序列化漏洞无法在公网利用。
可行的漏洞修复方法
部署负载均衡设备
在weblogic服务器外层部署负载均衡设备,可以修复JAVA反序列化漏洞。
优点
缺点
对系统影响小,不需测试对现有系统功能的影响
需要购买设备;无法防护从内网发起的JAVA反序列化漏洞攻击
部署单独的web代理
在weblogic服务器外层部署单独的web代理,可以修复JAVA反序列化漏洞。
优点
缺点
同上
同上
在weblogic服务器部署web代理
问题一:java 中的序列化是什么意思 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
简单来说 序列化就是把Java对象储存在某一地方(硬盘、网络),以便于传输
问题二:什么是序列化 序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序俯化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
问题三:java对象的序列化是什么意思 1、序列化是干什么的?
简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。虽然你可以 用自己的各种方法来保存Object states,
但是Java给你提供一种应该比你自己好的保存对象状态的机制、那就是序列化。
2、什么情况下需要序列化?
a)当你想把的内存中的对象保存到一个文件或者数据库中时候。
b)当你想用套接字在网络上传送对象的时候
c)当你想通过RMI传输对象的时候(RMI->Remote Method Invocation 远程方法调用)
3、当对一个对象实现序列化时,究竟发生了什么?
在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实体变量(instance ariable)
例如:Foo myFoo=new Foo(); myFoosetWidth(20); myFoosetHeight(40);
问题四:Java中为什么要序列化?什么时候用到序列化? 序列化可以将内存中的类写入文件或数据库中。比如将某个类序列化后存为文件,下次读取时只需将文件中的数据反序列化就可以将原先的类还原到内存中。也可以将类序列化为流数据进行传输。总的来说就是将一个已经实例化的类转成文件存储,下次需要实例化的时候只要反序列化即可将类实例化到内存中并保留序列化时类中的所有变量和状态。
例如:hibernate中实体类的钝化就是将类序列化后存入磁盘并释放内存空间。
问题五:JAVA中,序列化是指的什么?有何用途? 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
是对象永久化的一种机制。
确切的说应该是对象的序列化,一般程序在运行时,产生对象,这些对象随着程序的停止运行而消失,但如果我们想把某些对象(因为是对象,所以有各自不同的特性)保存下来,在程序终止运行后,这些对象仍然存在,可以在程序再次运行时读取这些对象的值,或者在其他程序中利用这些保存下来的对象。这种情况下就要用到对象的序列化。
对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整性和可传递性。譬如通过网络传输,或者把一个对象保存成一个文件的时候,要实现序列化接口
问题六:在JAVA中什么叫序列化和反序列化 30分 序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
问题七:将数据序列化有什么作用啊? 啊?序列化?应该是说一个数据结构,比如二叉树之类,序列化以后会变成一个char数组或者一个string字符串这样,方便你存到文件里面或者通过网络传输。然后要恢复的时候就是“反序列化”,把文件里读出来/从网络收到的char数组或者string恢复成一棵二叉树或者其他什么东西。
主要就是方便保存
问题八:C#序列化和反序列化到底是什么意思? 序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。
我想最主要的作龚有:
1、在进程下次启动时读取上次保存的对象的信息
2、在不同的AppDomain或进程之间传递数据
3、在分布式应用系统中传递数据
问题九:c#中什么叫序列化操作? 在C#中序列化操作简单点来理解就是把内存的东西写到硬盘中,当然也可以写到内存中,而反序列化就是从硬盘中把信息读到内存中。 下面以 BinaryFormatter序列化类Book作为例子说明下什么是序列化。定义类Book: [Serializable]
public class Book
{
string name;
float price;
string author; public Book(string bookname, float bookprice, string bookauthor)
{
name = bookname;
price = bookprice;
author = bookauthor;
}
} 在类的上面增加了属性:Serializable(如果不加这个属性,将抛出SerializationException异常) 通过这个属性将Book标志为可以序列化的当然也有另一种方式使类Book可以序列化,那就是实行ISerializable接口了在这里要注意了:Serializable属性是不能被继承的咯!!! 如果你不想序列化某个变量,该怎么处理呢很简单,在其前面加上属性[NonSerialized] 比如我不想序列化 string author; 那我只需要 [NonSerialized] string author; 好了,现在请看怎么实现序列化: 我们使用namespace: using System; using SystemIO; using SystemRuntimeSerializationFormattersBinary; 首先创建Book实例,like this: Book book = new Book(Day and Night, 300f, Bruce); 接着当然要创建一个文件了,这个文件就是用来存放我们要序列化的信息了 FileStream fs = new FileStream(@C:\bookdat, FileModeCreate); 序列化的实现也很简单,like this: BinaryFormatter formatter = new BinaryFormatter();
formatterSerialize(fs, book); 很简单吧!现在我列出整个原代码,包括反序列化 static void Main(string[] args)
{
Book book = new Book(Day and Night, 300f, Bruce); using(FileStream fs = new FileStream(@C:\bookdat, FileModeCreate))
{
BinaryFormatter formatter = new BinaryFormatter();
formatterSerialize(fs, book);
} book = null; using(FileStream fs = new FileStream(@C:\bookdat, FileModeOpen))
{
>>
问题十:php 什么是序列化 string serialize ( mixed value )
serialize() 返回字符串,此字符串包含了表示 value 的字节流,可以存储于任何地方。
这有利于存储或传递 PHP 的值,同时不丢失其类型和结构。
想要将已序列化的字符串变回 PHP 的值,可使用 unserialize()。serialize() 可处理除了 resource 之外的任何类型。甚至可以 serialize() 那些包含了指向其自身引用的数组。你正 serialize() 的数组/对象中的引用也将被存储。
当序列化对象时,PHP 将试图在序列动作之前调用该对象的成员函数 __sleep()。这样就允许对象在被序列化之前做任何清除操作。类似的,当使用 unserialize() 恢复对象时, 将调用 __wakeup() 成员函数。
注: 在 PHP 3 中,对象属性将被序列化,但是方法则会丢失。PHP 4 打破了此限制,可以同时存储属性和方法。请参见类与对象中的序列化对象部分获取更多信息。
例子 1 serialize() 示例
form
<form id="fs"><div class="field">
<label>name</label>
<input type="text" name="name">
</div>
<div class="field">
<label>name</label>
<input type="text" name="age">
</div>
<div class="field">
<label>name</label>
<input type="text" name="charId">
</div>
</form>
js:
//序列化var data = $('#fs')serialize();
consolelog(data)//=> 'name=val&age=val&charId=val'
//反序列化
var data = 'name=val&age=val&charId=val';
datasplit('&')forEach(function(param){
param = paramsplit('=');
var name = param[0],
val = param[1];
$('#fs [name=' + name + ']')val(val);
})
0条评论