java安全编程

          java安全程序实际上是一个点稍微防御性编程意味着内,竟java作为编程语言,较C,c++,本身被认为是比较安全的,随着C,C++这样的偏底层的编程语言比,java少了显示的指针调用。少了程序上的内存释放。回收。这些统统都交给了JVM。并且在内存分配的也做了一些检測,诸如越界检測ArrayIndexOutOf。还有空指针保存NullPointerException,这一切的不同使得java的使用也变得相对简单很多,在语言自身上避免了非常多不安全的可能出现。可是虽然java在编程上是安全的,可是这并不意味着程序猿们能够任意的写代码了。

之前某组织的一份报告表明,在近期的近千个漏洞中,有64%的漏洞都是因为编写的程序引起的。程序猿如果对自己的编程习惯不够重视的。必定会为此付出代价。

本篇文章我想聊聊的是在安全方面,可能会出现的几个安全漏洞,在这里我说的很多其它的是针对的java平台的语言,但我相信相同适用于不论什么一种其它语言,安全性问题都是普通存在。相同的嘛。

        1.错位的信任。一个软件系统能够分为多个子系统,每一个子系统有各自的訪问模块,能够这么说每一个子模块都有自己的受信域,可是他们自身是不能给自己赋予自己受信级别的,应该是由程序的部署者来确定,所以在这里我们说。划分好每一个模块的受信域,而且保证保证每一个子模块在自己的模块活动。一个好的安全设计模式事实上应该是非信任解耦以及权限分离的结合。

        2.注入攻击,这个太常见了,平时说的最多的恐怕就是sql注入攻击了。当组件或系统在接受外部数据源的时候,有些数据能够是恶意的数据。假设此时不加以验证处理。就会导入注入攻击。这里我们倡导的做法是(1)验证。比方说各种数值的验证,是否在给定的要求范围内(2).净化,这指的是避免敏感数据的暴露。能够通过删除特殊字符,或进行转码的形式。

(3).最后是标准化和归一化。将输入的形式转化为最简单的形式。这事实上是一种有损装换的过程。

经历了以上过程。不要以为就能够万事无忧了。当接受到复杂的指令字符串时,当在这些字符串中存在的一个特殊字符,比方"delete , insert"等会触发动作的关键词,也必须进行处理。否则,还是会出现安全漏洞。以下是一些对此状况的解决方式:

(1).操作系统的命令解释器

(2).详细SQL兼容接口的数据库

(3).XML解释器

(4).XPath评估器

(5).基于轻量级的文件夹訪问协议的文件夹服务,俗称LDAP

(6).脚本引擎

(7).正則表達式(regex)编译器

有些我们听过。

有些,确实我也没有听过。

       3.敏感数据泄露。敏感数据指的范围非常广,我们常说的用户信息,当然就是敏感数据了,还有号码。银行账号。更别说更加机密的各种密钥了。所以在传输数据的过程中,我们一般降低对敏感数据的传输,可是真的须要此数据交互的时候,也要对这些数据进行过滤处理,在传送给非信任的组件。来张演示图:


在java里是怎样做出这样操作呢,在java中。我们是通过类。接口,成员实现訪问控制的。

类和类成员给予尽可能低的訪问权限。

接口也尽量开放之同意公开訪问的方法。

         4.效能泄露。首先解释一下什么叫效能,效能指的是在授权中能够进行沟通而不会忘记的标识。每一个java对象都有不会被遗忘的标识。所以我们自然能够联系到这些对象的引用事实上就是就是这些对象的标示,也就是效能。对于那些会运行敏感操作的对象的引用来说。他们仅仅同意他们的持有者运行这些操作的效能,就是对象引用,所以引用自身必须保证效能不能泄露给非受信代码。

         5.拒绝服务。

俗称dos攻击。

如今还有了ddos,分布式拒绝攻击了。拒绝攻击的原因非常easy,就是有些恶意程序霸占着系统不放,导致正常的程序得不到资源,终于导致系统瘫痪。资源就无故耗尽。

在<<java安全编码规范>>一书中提到了一些dos攻击的样例:

(1).请求一个大的矢量图片,如SVG文件或字体文件

(2)."ZIP"炸弹,那些经过zip,gzip压缩过的HTML文件,会由于解压而消耗巨大的资源

(3).“XML解析炸弹”。解析XML文档的时候。假设结点非常多,将会迅速号费非常多的内存空间

(4).过度使用磁盘空间

(5).在一个散列表中插入了多个密钥。而这些密钥的使用同样的散列码,这样会导致最差的性能O(n*n),而不是平均性能O(n)

(6).发起很多连接,server为每一个连接分配大量的资源比如泛洪攻击。


       6.最低权限原则。

这点在上面提到一些方法里都或多或少的已经有所体现。java灵活的安全模型赋予应用很多其它的权限,这能够通过自己定义安全策略来完毕。特权操作应该仅仅提供给那些最少的须要特权的代码。java的AccessController机制同意仅仅有须要的代码能够获得权限的提升。当一个类须要改变他的权限时。能够调用AccessController的doPriviliged()方法,获得暂时的特权,可是还是尽可能的少出现doPriviliged()方法,从而避免出现安全漏洞。

       7.安全管理器。这里说的安全管理器。指的是java中的SecurityManager。在使用java API的时候,当出现运行违反安全策略的操作时,系统都会报出SecurityException的错误。

我们在使用java编敲代码的时候,使用的是系统默认的SecurityManager,当是当我们队安全的要求比較高的时候。我们鼓舞很多其它的去实现一个自己定义的安全管理器,在代码中常常想到会使用AcsessController,帮助我们去限制或获取一些特权的代码。

      以上就是我对于java安全性编程的一些看法,终于还是得看个人,说的再多。假设不去做的话,还是没用,还是希望可以有很多其它的程序猿一起增加到安全性编程的队伍中去,提高自己的编码水平。

版权声明:本文博主原创文章,博客,未经同意不得转载。

posted @ 2015-09-17 15:37  phlsheji  阅读(2577)  评论(0编辑  收藏  举报