真能闹,怕喇喇蛄,还不种稻子了?
喇喇蛄,是东北的一种害虫,经常在种水稻的季节,在池埂子上盗洞,导致稻田里的水悄悄的流没了,影响稻苗发育。
后来发现原来写代码,也能碰见“蝲蝲蛄”,无论你写的是什么功能、哪种技术、作何目的,蝲蝲蛄总能给盗几个洞出来。“你这已经有其他的某某了你怎么还造轮子”、“你这方案不行程序员不要浪费时间”、“也没看出来你这有啥优势和价值呀怎么给业务赋能”,这种话听上去“贼”有道理,吹的叮当的,但让他去做又能搞的稀的囊的。
所以,远离蝲蝲蛄,做你想做的、搞你想搞的、学你想学的,知识是不断沉淀的积累、方案是积累后的创造。
怎么办,都有标准的研发规范,但还是没法控制住到具体的每个研发下,给写出什么代码了。
有时候标准只是文档,看和执行的这个过程中就会一定的转行失效性,你可能会想加手段;评审、扣钱、罚绩效、检讨等等,但这样可能还只是增加过程成本,最终效果也不会太好。不太可能一个写代码还得配一个保姆,所以就像 p3c、pmd-idea,这样的插件出来了,帮助程序员把代码写好,治理掉一些不合标准的问题代码。
那么,你好奇这个事是怎么干的吗,怎么你就在 IDEA 写代码,它就能给你检测出来,告诉你有问题,并提醒你修改以及有些还可以一键帮助你修改呢?那如果你想再增加点你们公司个性的要求的时候,怎么扩展呢?本章节我们就使用 IDEA 插件开发能力,把这个事办喽
- guide-idea-plugin-pmd
- ├── .gradle
- └── src
- ├── main
- │ └── java
- │ └── cn.bugstack.guide.idea.plugin
- │ ├── rule
- │ │ ├── FastJsonAutoType.java
- │ │ ├── HardcodedIp.java
- │ │ └── ReplacePseudorandomGenerator.java
- │ └── utils
- │ └── InspectionBundle.java
- ├── resources
- │ ├── inspectionDescriptions
- │ │ ├── FastJsonAutoType.html
- │ │ ├── HardcodedIp.html
- │ │ └── ReplacePseudorandomGenerator.html
- │ └── META-INF
- │ └── plugin.xml
- ├── build.gradle
- └── gradle.properties
在此 IDEA 插件工程中,主要分为3块区域:
目的:把代码中的 new Random 不安全伪随机数警告并提供修复,处理为 new SecureRandom
RandomRule
- PsiElementFactory factory = JavaPsiFacade.getElementFactory(project);
- typeElement.replace(factory.createTypeElementFromText("SecureRandom", null));
- PsiNewExpression secureNewExp = (PsiNewExpression) factory.createExpressionFromText("new SecureRandom()", null);
- newExp.replace(secureNewExp);
目的:com.alibaba:fastjson 在开启 AutoTypeSupport 时,存在反序列化风险。如果程序中有 ParserConfig.getGlobalInstance().setAutoTypeSupport(true); 代码直接提醒删除处理。
- public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) {
- return new JavaElementVisitor() {
- @Override
- public void visitMethodCallExpression(PsiMethodCallExpression expression) {
- if (hasFullQualifiedName(expression, "com.alibaba.fastjson.parser.ParserConfig", "setAutoTypeSupport")) {
- PsiExpression[] args = expression.getArgumentList().getExpressions();
- if (args.length == 1 &&
- args[0] instanceof PsiLiteralExpression &&
- Boolean.TRUE.equals(((PsiLiteralExpression) args[0]).getValue())
- ) {
- holder.registerProblem(
- expression,
- "FastJson unserialization risk",
- ProblemHighlightType.GENERIC_ERROR_OR_WARNING,
- new DeleteElementQuickFix(expression, "!Fix: remove setAutoTypeSupport")
- );
- }
- }
- }
- };
- }
整个对代码检测的操作基本都是类似的,这个无非也是检测出代码库,并进行删除的提醒处理 DeleteElementQuickFix
- 小傅哥-提醒: 不安全的伪随机数生成器
java.util.Random 依赖一个可被预测的伪随机数生成器。
最佳实践:
使用java.security.SecureRandom
提醒模板需要编写 html 格式的内容,这个内容会被展示到错误代码的详情里。后面我们做测试的可以查看
- language="JAVA" groupPath="Java"
- groupName="X-PMD" enabledByDefault="true" level="ERROR"
- bundle="InspectionBundle" key="replace.pseudorandom.generator.name"
- implementationClass="cn.bugstack.guide.idea.plugin.rule.RandomRule"
- />
- language="JAVA" groupPath="Java"
- groupName="X-PMD" enabledByDefault="true" level="ERROR"
- bundle="InspectionBundle" key="fastjson.auto.type.name"
- implementationClass="cn.bugstack.guide.idea.plugin.rule.FastJsonRule"
- />
- language="JAVA" groupPath="Java"
- groupName="X-PMD" enabledByDefault="true" level="WARNING"
- bundle="InspectionBundle" key="hardcoded.ip.name"
- implementationClass="cn.bugstack.guide.idea.plugin.rule.IPRule"
- />
在 plugin.xml 中配置我们自己开发好的代码静态检测对象,这样你的检测类就生效了。
如果你下载代码后,没有 Plugin 可以自己配置一下,在 Tasks 中配置 :runIde
当你点击 Fix,那么接下来就可以进行自动替换代码并修复了,就是把 Random random = new Random() 替换为 SecureRandom random = new SecureRandom();
其他2个也可以在获取代码后进行测试验证,一个是IP,另外一个是使用 ParserConfig.getGlobalInstance().setAutoTypeSupport(true); 的错误提醒。
文章名称:通过Inspection机制,对静态代码安全审查
本文URL:http://www.shufengxianlan.com/qtweb/news26/312676.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联