成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

通過Inspection機制,對靜態代碼安全審查

安全 應用安全
本章節我們學習了如何使用 IDEA 原生 Inspection 檢查機制,擴展我們自己需要添加的代碼檢測邏輯,以及使用 LocalQuickFix 的實現類,做代碼的替換和引入響應包的操作。

[[442105]]

一、前言

真能鬧,怕喇喇蛄,還不種稻子了?

喇喇蛄,是東北的一種害蟲,經常在種水稻的季節,在池埂子上盜洞,導致稻田里的水悄悄的流沒了,影響稻苗發育。

后來發現原來寫代碼,也能碰見“蝲蝲蛄”,無論你寫的是什么功能、哪種技術、作何目的,蝲蝲蛄總能給盜幾個洞出來。“你這已經有其他的某某了你怎么還造輪子”、“你這方案不行程序員不要浪費時間”、“也沒看出來你這有啥優勢和價值呀怎么給業務賦能”,這種話聽上去“賊”有道理,吹的叮當的,但讓他去做又能搞的稀的囊的。

所以,遠離蝲蝲蛄,做你想做的、搞你想搞的、學你想學的,知識是不斷沉淀的積累、方案是積累后的創造。

二、需求目的

怎么辦,都有標準的研發規范,但還是沒法控制住到具體的每個研發下,給寫出什么代碼了。

有時候標準只是文檔,看和執行的這個過程中就會一定的轉行失效性,你可能會想加手段;評審、扣錢、罰績效、檢討等等,但這樣可能還只是增加過程成本,最終效果也不會太好。不太可能一個寫代碼還得配一個保姆,所以就像 p3c、pmd-idea,這樣的插件出來了,幫助程序員把代碼寫好,治理掉一些不合標準的問題代碼。

那么,你好奇這個事是怎么干的嗎,怎么你就在 IDEA 寫代碼,它就能給你檢測出來,告訴你有問題,并提醒你修改以及有些還可以一鍵幫助你修改呢?那如果你想再增加點你們公司個性的要求的時候,怎么擴展呢?本章節我們就使用 IDEA 插件開發能力,把這個事辦嘍

三、案例開發

1. 工程結構

  1. guide-idea-plugin-pmd 
  2. ├── .gradle 
  3. └── src 
  4.     ├── main 
  5.     │   └── java 
  6.     │    └── cn.bugstack.guide.idea.plugin  
  7.     │        ├── rule 
  8.     │        │   ├── FastJsonAutoType.java 
  9.     │        │   ├── HardcodedIp.java     
  10.     │        │   └── ReplacePseudorandomGenerator.java          
  11.     │        └── utils    
  12.     │            └── InspectionBundle.java     
  13.     ├── resources 
  14.     │   ├── inspectionDescriptions 
  15.     │   │   ├── FastJsonAutoType.html 
  16.     │   │   ├── HardcodedIp.html   
  17.     │   │   └── ReplacePseudorandomGenerator.html    
  18.     │   └── META-INF 
  19.     │       └── plugin.xml  
  20.     ├── build.gradle   
  21.     └── gradle.properties 

在此 IDEA 插件工程中,主要分為3塊區域:

  • rule:規則配置區域,以繼承 IDEA 原生 Inspection 檢查類,擴展自身需要掃描的代碼片段,進行警告、注釋、修復。
  • inspectionDescriptions:是對應的警告注釋,編寫到 html 中,最終展示到 IDEA 下對應的問題代碼片段上。
  • plugin.xml:中需要配置 localInspection 也就是配置你自定義的代碼檢測實現類。

2. 偽隨機數檢測

目的:把代碼中的 new Random 不安全偽隨機數警告并提供修復,處理為 new SecureRandom

RandomRule

  1. PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); 
  2. typeElement.replace(factory.createTypeElementFromText("SecureRandom"null)); 
  3. PsiNewExpression secureNewExp = (PsiNewExpression) factory.createExpressionFromText("new SecureRandom()"null); 
  4. newExp.replace(secureNewExp); 
  • 通過繼承 AbstractBaseJavaLocalInspectionTool Override buildVisitor 方法,擴展檢測代碼。當你寫了這段方法后,IDEA 會把一行行的代碼都通過這個方法傳進來
  • 在 visitNewExpression 方法中擴展自身的檢測處理,遇到了哪種代碼片段,要提供什么樣的提醒以及提醒的級別,最后是提供一個 Fix 修復能力,這個修復能力就在替換這段代碼片段,通過還可以操作引入新包的動作 import xxx

3. FastJson檢測

目的:com.alibaba:fastjson 在開啟 AutoTypeSupport 時,存在反序列化風險。如果程序中有 ParserConfig.getGlobalInstance().setAutoTypeSupport(true); 代碼直接提醒刪除處理。

  1. public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) { 
  2.     return new JavaElementVisitor() { 
  3.         @Override 
  4.         public void visitMethodCallExpression(PsiMethodCallExpression expression) { 
  5.             if (hasFullQualifiedName(expression, "com.alibaba.fastjson.parser.ParserConfig""setAutoTypeSupport")) { 
  6.                 PsiExpression[] args = expression.getArgumentList().getExpressions(); 
  7.                 if (args.length == 1 && 
  8.                         args[0] instanceof PsiLiteralExpression && 
  9.                         Boolean.TRUE.equals(((PsiLiteralExpression) args[0]).getValue()) 
  10.                 ) { 
  11.                     holder.registerProblem( 
  12.                             expression, 
  13.                             "FastJson unserialization risk"
  14.                             ProblemHighlightType.GENERIC_ERROR_OR_WARNING, 
  15.                             new DeleteElementQuickFix(expression, "!Fix: remove setAutoTypeSupport"
  16.                     ); 
  17.                 } 
  18.             } 
  19.         } 
  20.     }; 

整個對代碼檢測的操作基本都是類似的,這個無非也是檢測出代碼庫,并進行刪除的提醒處理 DeleteElementQuickFix

4. 提醒模板

  1. <html> 
  2. <body> 
  3. <b>小傅哥-提醒:</b> 不安全的偽隨機數生成器 <br> 
  4. <br> 
  5. <p>java.util.Random 依賴一個可被預測的偽隨機數生成器。</p> 
  6. <br> 
  7. <p style="font-size: 10px;color: #629460;">最佳實踐:</p> 
  8. <p style="font-size: 10px;">使用java.security.SecureRandom</p> 
  9. </body> 
  10. </html> 

 

 

 

提醒模板需要編寫 html 格式的內容,這個內容會被展示到錯誤代碼的詳情里。后面我們做測試的可以查看

5. 檢測配置

  1. <extensions defaultExtensionNs="com.intellij"
  2.     <localInspection 
  3.             language="JAVA"       groupPath="Java" 
  4.             groupName="X-PMD"   enabledByDefault="true"   level="ERROR" 
  5.             bundle="InspectionBundle"     key="replace.pseudorandom.generator.name" 
  6.             implementationClass="cn.bugstack.guide.idea.plugin.rule.RandomRule" 
  7.     /> 
  8.      
  9.     <localInspection 
  10.             language="JAVA"       groupPath="Java" 
  11.             groupName="X-PMD"   enabledByDefault="true"   level="ERROR" 
  12.             bundle="InspectionBundle"     key="fastjson.auto.type.name" 
  13.             implementationClass="cn.bugstack.guide.idea.plugin.rule.FastJsonRule" 
  14.     /> 
  15.      
  16.     <localInspection 
  17.             language="JAVA"      groupPath="Java" 
  18.             groupName="X-PMD"  enabledByDefault="true"     level="WARNING" 
  19.             bundle="InspectionBundle"     key="hardcoded.ip.name" 
  20.             implementationClass="cn.bugstack.guide.idea.plugin.rule.IPRule" 
  21.     /> 
  22. </extensions> 

 

在 plugin.xml 中配置我們自己開發好的代碼靜態檢測對象,這樣你的檢測類就生效了。

四、測試驗證

啟動插件

如果你下載代碼后,沒有 Plugin 可以自己配置一下,在 Tasks 中配置 :runIde

錯誤提醒

錯誤詳情

當你點擊 Fix,那么接下來就可以進行自動替換代碼并修復了,就是把 Random random = new Random() 替換為 SecureRandom random = new SecureRandom();

其他2個也可以在獲取代碼后進行測試驗證,一個是IP,另外一個是使用 ParserConfig.getGlobalInstance().setAutoTypeSupport(true); 的錯誤提醒。

五、總結

 

  • 本章節我們學習了如何使用 IDEA 原生 Inspection 檢查機制,擴展我們自己需要添加的代碼檢測邏輯,以及使用 LocalQuickFix 的實現類,做代碼的替換和引入響應包的操作。
  • 另外對于代碼檢測,還有一個更加標準的工具叫 PMD 它是一款采用 BSD 協議的代碼檢查工具,你可以擴展實現為自己的標準和規范以及完善個性的提醒和修復操作。
  • 像 p3c 就是一款靜態代碼檢測工具,用的人也非常多,不過它的插件開發不是基于 Java 實現的,代碼開發上也并沒有一些注釋。所以非常建議閱讀 pmd-idea,這款代碼寫的非常好,抽象充足、結構清晰、內容完整:https://github.com/ybroeker/pmd-idea

 

責任編輯:武曉燕 來源: bugstack蟲洞棧
相關推薦

2021-11-04 05:43:38

GoKartGo代碼靜態安全分析

2013-02-27 10:11:06

代碼審查ThoughtBot

2010-10-08 10:42:30

2012-08-09 09:10:56

代碼審查代碼

2012-11-22 09:51:14

2012-03-15 16:52:39

JavaCodePro Ana

2020-09-25 22:14:22

TikTok程序禁令

2014-03-18 10:08:35

2019-11-21 10:29:24

中科曙光

2018-08-09 11:09:11

云安全

2013-10-24 09:43:58

代碼代碼審查

2014-10-29 13:52:38

程序員

2014-03-06 09:43:54

代碼編程習慣

2012-07-05 09:45:02

代碼審查

2014-05-23 16:19:26

網絡安全審查網絡安全

2012-05-17 09:28:06

代碼審查Java代碼

2023-05-23 11:45:43

2009-08-05 09:59:40

Code Review代碼審查工具

2023-09-11 08:00:00

代碼審查開發

2021-05-20 08:00:00

代碼開發工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美日韩在线一区 | 国产精品国产成人国产三级 | 国产视频线观看永久免费 | 激情久久网| 精品综合在线 | 国产亚洲精品精品国产亚洲综合 | 日韩久久久久久 | 精品欧美一区二区三区 | 成人精品国产一区二区4080 | 一级在线视频 | 中文字幕成人 | 国产美女自拍视频 | 午夜久久久 | 欧美成人精品在线观看 | 国产欧美一区二区三区在线播放 | 久久久久国产精品一区三寸 | 成人精品久久久 | 网站国产 | 在线免费观看视频你懂的 | 欧美成人精品二区三区99精品 | 日韩在线视频播放 | 日韩成人| 欧美精品导航 | 精品婷婷| 国内久久精品 | 亚洲精品一区在线 | 色婷婷九月 | 国产精品一区二区av | 天天插日日操 | 国产一区二区三区色淫影院 | 一呦二呦三呦国产精品 | 精品国产乱码久久久久久88av | 中文字幕在线二区 | 久草在线影 | 精品国产一区二区三区久久 | 中文字幕高清免费日韩视频在线 | 欧美精品一区二区免费 | xxxxx免费视频 | 黄色毛片大全 | 在线免费观看成人 | 国产亚洲精品精品国产亚洲综合 |