一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - java安全編碼指南之:對(duì)象構(gòu)建操作

java安全編碼指南之:對(duì)象構(gòu)建操作

2020-09-15 01:02flydean程序那些事 Java教程

這篇文章主要介紹了java安全編碼指南之:對(duì)象構(gòu)建操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

簡(jiǎn)介

程序員肯定是不缺對(duì)象的,因?yàn)殡S時(shí)都可以構(gòu)建一個(gè),對(duì)象多了肯定會(huì)出現(xiàn)點(diǎn)安全問(wèn)題,一起來(lái)看看在java的對(duì)象構(gòu)建中怎么保證對(duì)象的安全性吧。

構(gòu)造函數(shù)的異常

考慮下面的一個(gè)例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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!");
  }
}

上面的例子中,我們?cè)跇?gòu)造函數(shù)中做了一個(gè)securityCheck,因?yàn)檫@個(gè)securityCheck返回的值是false,所以會(huì)拋出SecurityException。

看下調(diào)用的例子:

?
1
2
3
4
public static void main(String[] args) {
  SensitiveOperation sensitiveOperation = new SensitiveOperation();
  sensitiveOperation.storeMoney();
}

這個(gè)調(diào)用會(huì)拋出下面的異常:

?
1
2
3
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)

那么問(wèn)題來(lái)了,上面的這個(gè)class是不是安全的呢?

Finalizer Attack

上面的class不是final的,所以我們可以構(gòu)造一個(gè)class去繼承它。然后考慮這樣一個(gè)問(wèn)題,當(dāng)構(gòu)造函數(shù)拋出異常之后,會(huì)執(zhí)行什么操作呢?

如果該對(duì)象已經(jīng)被構(gòu)建了,那么這個(gè)對(duì)象在GC的時(shí)候需要執(zhí)行finalize方法。那么我們是不是可以在finalize方法中繞過(guò)安全檢查呢?

看下面的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
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,并且實(shí)現(xiàn)了finalize方法,在finalize中,我們調(diào)用了storeMoney。看下運(yùn)行的代碼:

?
1
2
3
4
5
6
7
8
9
10
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);
}

運(yùn)行結(jié)果:

?
1
2
3
Security check failed!
We can still do store Money action!
Store 1000000 RMB!

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

這個(gè)操作就叫做Finalizer Attack。

解決Finalizer Attack

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

使用final class

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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方法

因?yàn)樽宇愊胍貙?xiě)finalize方法,如果我們的父類中finalize方法定義為final,也可以解決這個(gè)問(wèn)題。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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變量

我們可以在對(duì)象構(gòu)建完畢的時(shí)候設(shè)置一個(gè)flag變量,然后在每次安全操作的時(shí)候都去判斷一下這個(gè)flag變量,這樣也可以避免之前提到的問(wèn)題:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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需要設(shè)置為volatile,只有這樣才能保證構(gòu)造函數(shù)在flag設(shè)置之前執(zhí)行。也就是說(shuō)需要保證happens-before特性。

使用this或者super

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

因?yàn)镴ava確保java.lang.Object構(gòu)造函數(shù)在任何構(gòu)造函數(shù)的第一條語(yǔ)句之上或之前執(zhí)行。如果構(gòu)造函數(shù)中的第一個(gè)語(yǔ)句是對(duì)超類的構(gòu)造函數(shù)或同一個(gè)類中的另一個(gè)構(gòu)造函數(shù)的調(diào)用,則java.lang.Object構(gòu)造函數(shù)將在該調(diào)用中的某個(gè)位置執(zhí)行。否則,Java將在該構(gòu)造函數(shù)的代碼中的任何一個(gè)執(zhí)行之前執(zhí)行超類的默認(rèn)構(gòu)造函數(shù),并且將通過(guò)隱式調(diào)用執(zhí)行java.lang.Object構(gòu)造函數(shù)。

也就是說(shuō)如果異常發(fā)生在構(gòu)造函數(shù)中的第一條this或者super中的時(shí)候,JVM將不會(huì)調(diào)用對(duì)象的finalize方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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安全編碼指南之:對(duì)象構(gòu)建操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/superfjj/article/details/108334341

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 九九精品视频在线播放 | 国产日韩精品一区二区 | 男同gay玩奴男同玩奴 | 日产精品一二三四区国产 | 69人成网站色www | 日出水了特别黄的视频 | 欧美性受xxxx88喷潮 | 我和岳偷长篇小说 | 性欧美videosex18嫩 | 护士让我吃奶我扒她奶 | 国产久草在线 | 亚洲精品综合一二三区在线 | 成人久久18网站 | 蜜色影院 | 私人黄色影院 | 亚洲精品国产在线 | 亚洲日本久久一区二区va | 欧美高清一区 | 免费午夜影片在线观看影院 | 国产我不卡 | 处女摘花| 欧美日韩国产在线人成dvd | 91夜夜操| 先锋资源av | mm在线| 日本老妇乱子伦中文视频 | 国产乱子伦真实china | 国产一级在线免费观看 | 色婷婷综合缴情综六月 | 俄罗斯男男激情1069gay | 日本最新伦中文字幕 | 青草视频网站在线观看 | 99视频有精品视频免费观看 | 3d动漫h在线观看网站蜜芽 | 女教师波多野结衣高清在线 | 亚洲国产一区二区三区a毛片 | 免费观看视频高清在线 | 甜蜜惩罚小说 | 亚洲色图150p | 国产日韩片 | 秋葵污视频 |