国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java安全編碼指南之:表達式規則說明

java安全編碼指南之:表達式規則說明

2020-09-15 00:54flydean程序那些事 Java教程

這篇文章主要介紹了java安全編碼指南之:表達式規則說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

簡介

java編寫過程中,我們會使用到各種各樣的表達式,在使用表達式的過程中,有哪些安全問題需要我們注意的呢?一起來看看吧。

注意表達式的返回值

我們在使用JDK庫的時候,一定要注意認真的讀一下JDK中方法的含義和它的返回值。

有些返回值可能表示這個操作是否成功,有的返回值可能是方法操作的結果。我們看兩個常見的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
public void deleteFileWrong(){
 File file= new File("/tmp/www.jfrwli.cn.txt");
 file.delete();
 System.out.println("File delete success!");
}
 
public void deleteFileRight(){
 File file= new File("/tmp/www.jfrwli.cn.txt");
 if(file.delete()){
  System.out.println("File delete success!");
 }
}

先看一個文件刪除的例子,delete方法是有返回值的,所以我們在調用delete方法之后,一定要判斷一下返回值,看是否刪除成功。

再看一個常見的String中字符替換的例子:

?
1
2
3
4
5
6
7
8
9
10
public void stringReplaceWrong(){
 String url="www.jfrwli.cn";
 url.replace("www","WWW");
 System.out.println("replaced url..."+url);
}
public void stringReplaceRight(){
 String url="www.jfrwli.cn";
 url=url.replace("www","WWW");
 System.out.println("replaced url..."+url);
}

我們要記住,String是不可變的,所以它的replace方法,會返回一個替換過后的String,但是原String是不變的,所以我們需要將返回值重新賦值。

注意避免NullPointerException

NullPointerException應該是最最常見的運行時異常了。怎么避免這個異常呢?

我們要做的就是在調用object的方法時候,一定要判斷這個object是不是為空。

在JDK8之后,我們引入了Stream操作:

?
1
2
3
public void streamWrong(Collection<Object> collection){
 collection.stream().filter(obj->obj.equals("www.jfrwli.cn"));
}

Stream操作的過程中,我們需要注意stream中的元素是否為空。

有時候,我們可能覺得已經判斷是為空了,但是條件判斷不準確,導致未知的異常,看下面這個例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public int countWrong(Collection<Object> collection, Object object){
 int count=0;
 if(collection ==null){
  return count;
 }
 for(Object element: collection){
  if((element ==null && object== null)
   || element.equals(object)){
   count++;
  }
 }
 return count;
}

這個例子是用來查找collection中到底有多少元素和object相同,如果兩者都為空,也記為相同。

但是上面的例子有一個漏洞,它沒有考慮element ==null 而 object !=null的情況,所以會導致NullPointerException的生成。

我們需要這樣修改:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public int countRight(Collection<Object> collection, Object object){
 int count=0;
 if(collection ==null){
  return count;
 }
 for(Object element: collection){
  if((element ==null && object== null)
    || (element !=null && element.equals(object))){
   count++;
  }
 }
 return count;
}

數組相等的判斷

如果我們需要比較兩個數組是否相等,其實我們想比較的是兩個數組中的元素是否相等。

我們知道數組是一個特殊的Object,那么數組對象也有一個equals方法,考慮下面的例子:

?
1
2
3
4
5
public boolean compareWrong(){
 int[] array1 = new int[10];
 int[] array2 = new int[10];
 return array1.equals(array2);
}

返回的結果是false,因為數組直接使用了Object中定義的equals方法,我們看下該方法的定義:

?
1
2
3
public boolean equals(Object obj) {
 return (this == obj);
}

可以看到,該方法比較的是兩個地址是否相等。所以我們的到了false結果。

其實,我們可以使用Arrays.equals工具類中的方法來進行兩個數組的比較:

?
1
2
3
4
5
public boolean compareRight(){
 int[] array1 = new int[10];
 int[] array2 = new int[10];
 return Arrays.equals(array1, array2);
}

基礎類型的封裝類間的比較

在java中,我們知道有一些基礎類型像boolean, byte,char, short, int他們會有相對應的封裝類型:Boolean,Byte,Character,Short,Integer等。

我們可以直接將基礎類型的值賦值給封裝類型,封裝類型會自行進行轉換。

考慮下面的例子:

?
1
2
3
Boolean boolA=true;
Boolean boolB=true;
System.out.println(boolA==boolB);

結果是多少呢?

答案是true。為什么兩個不同對象的比較會是true呢?

在回答這個問題之前,我們看一下字符串的比較:

?
1
2
3
String stringA="www.jfrwli.cn";
String stringB="www.jfrwli.cn";
System.out.println(stringA==stringB);

這個我們大家應該都知道,因為String有一個字符串常量池,直接從字符串常量構建的String對象,其實是同一個對象。

同樣的對于Boolean和Byte來說,如果直接從基礎類值構建的話,也是同一個對象。

而對于Character來說,如果值的范圍在\u0000 to \u007f,則屬于同一個對象,如果超出了這個范圍,則是不同的對象。

對于Integer和Short來說,如果值的范圍在-128 and 127,則屬于同一個對象,如果超出了這個范圍,則是不同的對象。

再考慮下面的例子:

?
1
2
3
Boolean boolA=true;
Boolean boolC=new Boolean(true);
System.out.println(boolA==boolC);

輸出的結果是false,因為boolC使用了new關鍵字,構建了一個新的對象。

集合中類型不匹配

現在java集合可以通過指定類型,從而只存儲特定類型的對象。考慮下面的一個例子:

?
1
2
3
4
5
6
7
8
public void typeMismatch(){
 HashSet<Short> shortSet= new HashSet<>();
 for(int i=0;i<10;i++){
  shortSet.add((short)i);
  shortSet.remove(i);
 }
 System.out.println(shortSet.size());
}

上面代碼我們定義了一個Short的集合,然后將0-9添加進去,接著我們又調用了remove方法把i從集合刪除。

但是最后輸出結果是10,表明我們并沒有刪除成功。為什么呢?

看下HashSet的remove方法:

?
1
2
3
public boolean remove(Object o) {
 return map.remove(o)==PRESENT;
}

remove方法的參數是Object,我們傳入的i是int類型的,跟short不匹配,所以導致刪除失敗。

我們需要這樣修改:

?
1
2
3
4
5
6
7
8
public void typeMatch(){
 HashSet<Short> shortSet= new HashSet<>();
 for(int i=0;i<10;i++){
  shortSet.add((short)i);
  shortSet.remove((short)i);
 }
 System.out.println(shortSet.size());
}

Asset的副作用

我們會使用Asset語句在代碼中做調試使用,在使用的過程中需要注意Asset語句不要對系統的業務邏輯產生副作用,也就是說即使Asset語句不運行,也不會修改代碼的業務邏輯。

看下面的例子:

?
1
2
3
public void assetWrong(ArrayList<Integer> list){
 assert list.remove(0)>0;
}

上的代碼我們從list中刪除第一個元素,并判斷刪除的元素是否大于0.

上面的代碼如果assert語句不執行的話,會導致業務邏輯也不執行,所以需要修改成下面這樣:

?
1
2
3
4
public void assetRight(ArrayList<Integer> list){
 int result=list.remove(0);
 assert result>0;
}

本文的例子:

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

補充知識:Slow HTTP Denial of Service Attack 漏洞解決

解決漏洞需要修改tomcat conf 下 server.xml 文件

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="2000" redirectPort="8443" URIEncoding="UTF-8"/> connectionTimeout="20"

以上這篇java安全編碼指南之:表達式規則說明就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产99精品| 日韩美女毛片 | 在线观看成人国产 | 中文字幕第18页 | 黄网免费看 | 亚洲天堂av网 | 狠狠爱综合 | 亚洲综合自拍 | 免费高潮 | 久久青| 黄色在线免费看 | 中文字幕一区二区三区在线视频 | 欧美精三区欧美精三区 | 久久久国产精品 | 男女视频网址 | 欧美黄网站 | 亚洲精品国产a久久久久久 99热少妇 | 欧美激情小视频 | 国产精品视频观看 | 亚洲91av | 久久99深爱久久99精品 | 亚洲国产精品久久久 | 精品久久99 | 亚洲乱码国产乱码精品精的特点 | 国产免费亚洲 | 在线观看免费毛片视频 | 国产av毛片 | 成年女人在线观看 | 亚洲福利精品视频 | 一级黄色免费网站 | 亚洲一区二区在线 | 日韩欧美在线观看一区二区 | 久久涩涩| www中文字幕 | 亚洲91| 精品玖玖玖 | 国产一区在线免费观看 | 欧美日韩国产在线观看 | 亚洲综合影院 | 精品成人av | 国产精品久久久久久久久久久天堂 |