如何防止java编程语言序列化网络攻击?

如何防止java编程语言序列化网络攻击?,第1张

java编程一直以来都是互联网软件开发市场上的主流开发语言,同样的这也就导致了只要发生漏洞的话,所有用java编程开发的软件都会出现问题,下面北京java培训就一起来了解一下,java编程语言中的序列化问题应该如何解决。

什么是序列化?

自从1997年发布JDK1.1以来,序列化已经存在于Java平台中。

它用于在套接字之间共享对象表示,或者将对象及其状态保存起来以供将来使用(反序列化)。

在JDK10及更低版本中,序列化作为java.base包和java.io.Serializable方法的一部分存在于所有的系统中。

序列化的挑战和局限

序列化的局限主要表现在以下两个方面:

出现了新的对象传输策略,例如JSON、XML、ApacheAvro、ProtocolBuffers等。

1997年的序列化策略无法预见现代互联网服务的构建和攻击方式。

进行序列化漏洞攻击的基本前提是找到对反序列化的数据执行特权 *** 作的类,然后传给它们恶意的代码。

序列化在哪里?如何知道我的应用程序是否用到了序列化?

要移除序列化,需要从java.io包开始,这个包是java.base模块的一部分。常见的使用场景是:

实现Serializable接口和(可选)serialversionuid长整型字段。

使用ObjectInputStream或ObjectOutputStream。

使用严重依赖序列化的库,例如:Xstream、Kryo、BlazeDS和大多数应用程序服务器。

使用这些方法的开发人员应考虑使用其他存储和读回数据的替代方法。EishaySmith发布了几个不同序列化库的性能指标。在评估性能时,需要在基准度量指标中包含安全方面的考虑。默认的Java序列化“更快”一些,但漏洞也会以同样的速度找上门来。

我们该如何降低序列化缺陷的影响?

项目Amber包含了一个关于将序列化API隔离出来的讨论。我们的想法是将序列化从java.base移动到单独的模块,这样应用程序就可以完全移除它。在确定JDK11功能集时并没有针对该提议得出任何结果,但可能会在未来的Java版本中继续进行讨论。

通过运行时保护来减少序列化暴露

一个可以监控风险并自动化可重复安全专业知识的系统对于很多企业来说都是很有用的。Java应用程序可以将JVMTI工具嵌入到安全监控系统中,通过插桩的方式将传感器植入到应用程序中。

其他有用的安全技术

在进行维护时,可以不需要手动列出一长串东西,而是使用像OWASPDependency-Check这样的系统,它可以识别出已知安全漏洞的依赖关系,并提示进行升级。也可以考虑通过像DependABot这样的系统进行库的自动更新。

虽然用意很好,但默认的Oracle序列化过滤器存在与SecurityManager和相关沙箱漏洞相同的设计缺陷。因为需要混淆角色权限并要求提前了解不可知的事物,限制了这个功能的大规模采用:系统管理员不知道代码的内容,所以无法列出类文件,而开发人员不了解环境,甚至DevOps团队通常也不知道系统其他部分(如应用程序服务器)的需求。

摘 要 Java语言是Internet上最热门的编程语言 本文针对Java的网络功能 对Java从网络上获取图象 声音 HTML文档及文本文件等编程方法作了初步的介绍 同时介绍了动态获取网络上资源的方法作了介绍 文中提供了大量简明易懂的实例 关键词 Java Internet 网络Java语言是Internet上新兴的编程语言 对Java的特性以及基本的编程方法已有很多文章作过介绍 但是 广大Java爱好者更希望了解Java更深一步的编程方法 本文就Java的网络功能及其编程方法作一初步的介绍 为了方便初次接触Java的读者 本文先就Java编程的一些常识作简单介绍 一 Java编程简介 编程环境 对于大部分读者 以下的配置是较为经济的一种选择 *** 作系统 Win 编译软件 JDK 浏览软件 Netscape 以上( 位) 编程方法 先用文本编辑器如Edit NotePad等输入Java程序 以 java为文件名后缀存盘 再执行命令行 Javac 文件名 来编译Java程序 编译后生成后缀为 class的字节码文件 最后 如果是Java Applitcation 则执行命令行 Java 字节码文件名 来运行Java程序 如果是Java Applet 则用文本编辑器输入调用该Java Applet的HTML 文档 以 为文件名后缀存盘 再执行命令行 appletviewer HTML文件名 来运行Java Applet 或用Netscape打开该HTML文档 关于本文中程序的说明为了使程序能够最简洁地体现其所代表的编程方法 本文中的程序一般采用最简单的形式 省略了线程等内容 因此 本文的程序不是 好 的程序 但最容易为初学者理解 本文的所有程序经编译后 生成的字节码文件及对应的HTML文档已上载到~xyx/test/jvnet 均可正确运行 连入Internet的读者可用浏览器打开该地址 查看运行效果 连入Internet的读者也可以在本地硬盘输入并编译本文的程序 用Netscape的File/Open File菜单打开HTML文档 体会编程方法并查看运行效果 如果读者想将Java Applet 放到自己的主机上或其他ftp服务器上 在Netscape中用协议或ftp协议调用 出于安全性限制 应作如下修改 如果读者在某个WWW主机上有帐号 可以做个人Homepage(一般在用户根目录创建WWW或public_目录即可 Homepage的地址为 //HostName/~个人帐号) 可将本文程序中对应的~xyx/部分修改为读者自己的Web结点地址 然后将编译后生成的字节码文件及对应的HTML文档上载到自己的结点上 如果读者的计算机连入了Internet 也可以找一个可以上载的ftp结点 如 ftp:///ining 将本文程序中对应的~xyx/部分修改为ftp结点的地址 将编译后生成的字节码文件及对应的HTML文档上载到该结点上 以查看运行效果 如果读者的计算机没有联网 也可以在单机上运行Web 服务软件如Webstar for Win 将本文程序中对应的/~xyx/部分修改为//本地IP地址 的形式 来模拟网络编程 二 Java网络功能及获取网络上资源的一般步骤Java程序可以获取网络上结点的图象 声音 HTML文档及文本等资源 并可以对获得的资源进行处理 例如Java程序可以每隔一定时间读取某结点提供的最新数据 并以图表的形式显示出来 在编程处理上 一般先生成一个URL类型的对象 然后用 Java中相应的方法(method)获取该对象所代表的资源 下面分别介绍Java网络功能的几个例子 并由此介绍几种不同的编程方法 三 从网络上获取图象Java Applet可以直接从网络上结点获取图象并显示出来 为了了解其编程方法和从本地显示图象的编程有何不同 我们先不考虑网络功能 来看一个简单的图象显示的例子 ●程序 import java applet *import java awt *public class imag extends Applet{Image imagepublic void init() {image=getImage(getDocumentBase() test gif )}public void paint(Graphics g) {g drawImage(image this)}}这是一个最简单的获取并显示图象的例子 在该例中 先用getImage(getDocumentBase() 图象文件名)从HTML文档所在位置调用图象test gif 并由此生成一个Image类型的对象image 然后用drawImage(image this)在屏幕上将图象显示出来 如果想从网络上其他结点获取图象 关键是创建对应于网络上其他结点的Image类型的对象 一旦获得Image类型的对象获得了 便可以对其进行任何可能的图象 *** 作 Java提供了如下方法可以创建对应于其他结点的图象 getImage(new URL(字符串))其使用格式可有两种 String url = 结点URL Image imagetry {image = getImage(new URL(url))}catch(Exception e){System out println( Can t open the URL )}或URL imgur=nullImage imagetry {imgur=new URL( 结点URL )}catch (MalformedURLException e) {System out println( Can t open the URL )}image=getImage(imgur)前一种格式用 new URL(url) 生成 URL 对象 并直接作为getImage的参数 后一种格式先用 new URL(url) 生成一个 URL对象 再传给getImage 两种格式本质上是一样的 两种格式中 生成URL对象的部分都包含在try{获取URL对象}catch (MalformedURLException e) {出错提示}中 例如要调用~xyx/img/shnet jpg结点的图象 第一种格式完整的程序如下 ●程序 import java applet *import *import java awt *public class imag extends Applet{Image imagepublic void init() {String url = ~xyx/img/shnet jpg try {image = getImage(new URL(url))} catch(Exception e){}}public void paint(Graphics g) {g drawImage(image this)}}第二种格式完整的程序如下 ●程序 import java applet *import *import java awt *public class imag extends Applet{Image imageURL imgur=nullpublic void init() {try {imgur=new URL( ~xyx/img/shnet jpg )}catch (MalformedURLException e) {System out println( Can t open the URL )}image=getImage(imgur)}public void paint(Graphics g) {g drawImage(image this)}}将上述两个程序分别以imag java和imag java 存盘 执行javac imag java和javac imag java 将得到编译后生成的imagclass和imag class 最后创建调用这两个Java Applet的HTML文档 如imag class对应的HTML文档可如下 <><head ><title >Example </title ></head ><center ><applet code=imag.class width=550 height=250 ></applet ></ >将该HTML文档存入l文件 用Netscape打开 如果你的计算机连入了Internet 便可以看到Java Applet 所显示的从网络上获得的图象了 (对于本文中其他不同的Java Applet 对应的HTML文档只要修改其中相应的 code=imag class 即可 )四 从网络上获取声音Java从网络上获取声音文件并播放声音的编程方法有两类 一是利用Java提供的play(URL)及play(URL String) 直接播放网络上的声音文件 另一类是通过getAudioClip(URL)或getAudioClip(URL String)先从网络上获取声音文件 并生成AudioClip 类型的对象 然后对该对象进行 *** 作 前者的使用格式是 String Audur = 结点URL try {play(new URL(Audur))} catch(Exception e){}或String Audur = 结点URL try {play(new URL(Audur) 声音文件名)} catch(Exception e){}后者使用的格式是 String Audur = 结点URL AudioClip loopCliptry {loopClip = getAudioClip(new URL(Audur))}catch(Exception e){System out println( Can t open the URL )}或String Audur = 结点URL AudioClip loopCl lishixinzhi/Article/program/Java/hx/201311/26995


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12140713.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存