色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

java安全編碼指南之:對象構建操作

瀏覽:4日期:2022-08-24 17:22:45

簡介

程序員肯定是不缺對象的,因為隨時都可以構建一個,對象多了肯定會出現點安全問題,一起來看看在java的對象構建中怎么保證對象的安全性吧。

構造函數的異常

考慮下面的一個例子:

public class SensitiveOperation { public SensitiveOperation(){ if(!doSecurityCheck()){ throw new SecurityException('Security check failed!'); } } //Security check return false private boolean doSecurityCheck(){ return false; } public void storeMoney(){ System.out.println('Store 1000000 RMB!'); }}

上面的例子中,我們在構造函數中做了一個securityCheck,因為這個securityCheck返回的值是false,所以會拋出SecurityException。

看下調用的例子:

public static void main(String[] args) { SensitiveOperation sensitiveOperation = new SensitiveOperation(); sensitiveOperation.storeMoney(); }

這個調用會拋出下面的異常:

Exception in thread 'main' java.lang.SecurityException: Security check failed! at com.flydean.SensitiveOperation.<init>(SensitiveOperation.java:11) at com.flydean.SensitiveUsage.main(SensitiveUsage.java:10)

那么問題來了,上面的這個class是不是安全的呢?

Finalizer Attack

上面的class不是final的,所以我們可以構造一個class去繼承它。然后考慮這樣一個問題,當構造函數拋出異常之后,會執行什么操作呢?

如果該對象已經被構建了,那么這個對象在GC的時候需要執行finalize方法。那么我們是不是可以在finalize方法中繞過安全檢查呢?

看下面的例子:

public class SensitiveOperationFinalizer extends SensitiveOperation{ public SensitiveOperationFinalizer(){ } @Override protected void finalize() { System.out.println('We can still do store Money action!'); this.storeMoney(); System.exit(0); }}

上的例子中,我們繼承了SensitiveOperation,并且實現了finalize方法,在finalize中,我們調用了storeMoney??聪逻\行的代碼:

public void testFinalizer() throws InterruptedException { try { SensitiveOperation sensitiveOperation = new SensitiveOperationFinalizer(); sensitiveOperation.storeMoney(); }catch (Exception e){ System.out.println(e.getMessage()); } System.gc(); Thread.sleep(10000); }

運行結果:

Security check failed!We can still do store Money action!Store 1000000 RMB!

可以看到,雖然我們構造函數拋出了異常,但是storeMoney的操作還是被執行了!

這個操作就叫做Finalizer Attack。

解決Finalizer Attack

怎么解決這個構造函數拋出異常的問題呢?這里給大家介紹幾種解決方法。

使用final class

如果使用final class,那么類是不能夠被繼承的,問題自然就解決了。

public final class SensitiveOperationFinal { public SensitiveOperationFinal(){ if(!doSecurityCheck()){ throw new SecurityException('Security check failed!'); } } //Security check return false private boolean doSecurityCheck(){ return false; } public void storeMoney(){ System.out.println('Store 1000000 RMB!'); }}

使用final finalize方法

因為子類想要重寫finalize方法,如果我們的父類中finalize方法定義為final,也可以解決這個問題。

public final class SensitiveOperationFinal { public SensitiveOperationFinal(){ if(!doSecurityCheck()){ throw new SecurityException('Security check failed!'); } } //Security check return false private boolean doSecurityCheck(){ return false; } public void storeMoney(){ System.out.println('Store 1000000 RMB!'); } final protected void finalize() { }}

使用flag變量

我們可以在對象構建完畢的時候設置一個flag變量,然后在每次安全操作的時候都去判斷一下這個flag變量,這樣也可以避免之前提到的問題:

public class SensitiveOperationFlag { private volatile boolean flag= false; public SensitiveOperationFlag(){ if(!doSecurityCheck()){ throw new SecurityException('Security check failed!'); } flag=true; } //Security check return false private boolean doSecurityCheck(){ return false; } public void storeMoney(){ if(!flag){ System.out.println('Object is not initiated yet!'); return; } System.out.println('Store 1000000 RMB!'); }}

注意,這里flag需要設置為volatile,只有這樣才能保證構造函數在flag設置之前執行。也就是說需要保證happens-before特性。

使用this或者super

在JDK6或者更高版本中,如果對象的構造函數在java.lang.Object構造函數退出之前引發異常,則JVM將不會執行該對象的finalize方法。

因為Java確保java.lang.Object構造函數在任何構造函數的第一條語句之上或之前執行。如果構造函數中的第一個語句是對超類的構造函數或同一個類中的另一個構造函數的調用,則java.lang.Object構造函數將在該調用中的某個位置執行。否則,Java將在該構造函數的代碼中的任何一個執行之前執行超類的默認構造函數,并且將通過隱式調用執行java.lang.Object構造函數。

也就是說如果異常發生在構造函數中的第一條this或者super中的時候,JVM將不會調用對象的finalize方法:

public class SensitiveOperationThis { public SensitiveOperationThis(){ this(doSecurityCheck()); } private SensitiveOperationThis(boolean secure) { } //Security check return false private static boolean doSecurityCheck(){ throw new SecurityException('Security check failed!'); } public void storeMoney(){ System.out.println('Store 1000000 RMB!'); }}

本文的例子:

learn-java-base-9-to-20/tree/master/security

以上這篇java安全編碼指南之:對象構建操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 欧美日韩成人在线视频 | 美女被cao免费看在线看网站 | 日韩一区二区三区四区不卡 | 久久成人18 | 最新精品亚洲成a人在线观看 | 欧美亚洲不卡 | 三级视频在线播放 | 国产精品2020观看久久 | 亚洲系列第一页 | 最新亚洲一区二区三区四区 | 欧美一级毛片免费网站 | 91成年人 | 普通话对白国产精品一级毛片 | 久久这里只有精品免费播放 | 精品国产免费久久久久久 | 欧美成人自拍视频 | 日本一级高清片免费 | 亚洲国产精品专区 | 在线欧美色| 亚洲综合一区二区三区 | 亚洲国产综合精品 | 国产三级麻豆 | 黄色美女视频网站 | 99热久久国产这里是精品 | 亚洲第一色网 | 香蕉tv亚洲专区在线观看 | 国产1区2区三区不卡 | 毛片免费高清免费 | 国产大片在线观看 | 另类视频欧美 | 欧美精品一区二区三区免费 | 欧美一区二区三区高清视频 | 最新在线步兵区 | 一本久久道久久爱 | 成人ab片| 在线观看人成午夜影片 | 亚洲国产日韩精品 | 国产一区亚洲二区 | 全部在线美女网站免费观看 | 欧美99| 狠狠色综合久久丁香婷婷 |