通过Inspection机制,对静态代码安全审查

[[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

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/149710.html<

(0)
运维的头像运维
上一篇2025-03-12 18:03
下一篇 2025-03-12 18:05

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注