最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年09月14日 14:28:17   作者:flydean程序那些事  
這篇文章主要介紹了java安全編碼指南之:對象構建操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

簡介

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

構造函數(shù)的異常

考慮下面的一個例子:

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!");
  }
}

上面的例子中,我們在構造函數(shù)中做了一個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去繼承它。然后考慮這樣一個問題,當構造函數(shù)拋出異常之后,會執(zhí)行什么操作呢?

如果該對象已經(jīng)被構建了,那么這個對象在GC的時候需要執(zhí)行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,并且實現(xiàn)了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!

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

這個操作就叫做Finalizer Attack。

解決Finalizer Attack

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

使用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,只有這樣才能保證構造函數(shù)在flag設置之前執(zhí)行。也就是說需要保證happens-before特性。

使用this或者super

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

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

也就是說如果異常發(fā)生在構造函數(shù)中的第一條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中將異步調用轉為同步的五種實現(xiàn)方法

    Java中將異步調用轉為同步的五種實現(xiàn)方法

    本文介紹了將異步調用轉為同步阻塞模式的五種方法:wait/notify、ReentrantLock+Condition、Future、CountDownLatch和CyclicBarrier,每種方法都有其適用場景和核心機制,可以根據(jù)具體需求選擇合適的方法,需要的朋友可以參考下
    2025-02-02
  • JAVA使用ElasticSearch查詢in和not in的實現(xiàn)方式

    JAVA使用ElasticSearch查詢in和not in的實現(xiàn)方式

    今天小編就為大家分享一篇關于JAVA使用Elasticsearch查詢in和not in的實現(xiàn)方式,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java Calendar日歷類原理及使用方法

    Java Calendar日歷類原理及使用方法

    這篇文章主要介紹了Java Calendar日歷類原理及使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • java用接口、多態(tài)、繼承、類計算三角形和矩形周長及面積的方法

    java用接口、多態(tài)、繼承、類計算三角形和矩形周長及面積的方法

    這篇文章主要介紹了java用接口、多態(tài)、繼承、類計算三角形和矩形周長及面積的方法,涉及java面向對象中類、接口、多態(tài)等的使用技巧,需要的朋友可以參考下
    2015-05-05
  • java 字節(jié)流和字符流的區(qū)別詳解

    java 字節(jié)流和字符流的區(qū)別詳解

    這篇文章主要介紹了java 字節(jié)流和字符流的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • 利用Java簡單實現(xiàn)一個代碼行數(shù)統(tǒng)計器方法實例

    利用Java簡單實現(xiàn)一個代碼行數(shù)統(tǒng)計器方法實例

    這篇文章主要給大家介紹了關于如何利用Java簡單實現(xiàn)一個代碼行數(shù)統(tǒng)計器的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • IDEA Ultimate2020.2版本配置Tomcat詳細教程

    IDEA Ultimate2020.2版本配置Tomcat詳細教程

    這篇文章主要介紹了IDEA Ultimate2020.2版本配置Tomcat教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • java集合_淺談Iterable和Iterator的區(qū)別

    java集合_淺談Iterable和Iterator的區(qū)別

    下面小編就為大家?guī)硪黄猨ava集合_淺談Iterable和Iterator的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • Java中的事件處理機制詳細解讀

    Java中的事件處理機制詳細解讀

    這篇文章主要介紹了Java中的事件處理機制詳細解讀,ava事件處理是采取"委派事件模型",當事件發(fā)生時,產(chǎn)生事件的對象會把此"信息"傳遞給"事件的監(jiān)聽者"處理,需要的朋友可以參考下
    2024-01-01
  • Java多線程實現(xiàn)Runnable方式

    Java多線程實現(xiàn)Runnable方式

    這篇文章主要為大家詳細介紹了Java多線程如何實現(xiàn)Runnable方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03

最新評論

九龙城区| 西林县| 洛扎县| 开平市| 论坛| 黔西| 兰坪| 西和县| 建昌县| 商都县| 台湾省| 来宾市| 崇阳县| 雷波县| 宜都市| 池州市| 娱乐| 南和县| 长子县| 麻阳| 甘德县| 融水| 团风县| 榆树市| 绥阳县| 蚌埠市| 彰化县| 志丹县| 石台县| 昂仁县| 云南省| 沁源县| 威海市| 玉门市| 成都市| 安平县| 淮滨县| 云阳县| 三江| 兴和县| 全南县|