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安全性編程的一些看法,終於還是得看個人,說的再多。假設不去做的話,還是沒用,還是希望可以有很多其它的程序猿一起增加到安全性編程的隊伍中去,提高自己的編碼水平。

版權聲明:本文博主原創文章,博客,未經同意不得轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM