真能闹,怕喇喇蛄,还不种稻子了?

喇喇蛄,是东北的一种害虫,经常在种水稻的季节,在池埂子上盗洞,导致稻田里的水悄悄的流没了,影响稻苗发育。
后来发现原来写代码,也能碰见“蝲蝲蛄”,无论你写的是什么功能、哪种技术、作何目的,蝲蝲蛄总能给盗几个洞出来。“你这已经有其他的某某了你怎么还造轮子”、“你这方案不行程序员不要浪费时间”、“也没看出来你这有啥优势和价值呀怎么给业务赋能”,这种话听上去“贼”有道理,吹的叮当的,但让他去做又能搞的稀的囊的。
所以,远离蝲蝲蛄,做你想做的、搞你想搞的、学你想学的,知识是不断沉淀的积累、方案是积累后的创造。
怎么办,都有标准的研发规范,但还是没法控制住到具体的每个研发下,给写出什么代码了。
有时候标准只是文档,看和执行的这个过程中就会一定的转行失效性,你可能会想加手段;评审、扣钱、罚绩效、检讨等等,但这样可能还只是增加过程成本,最终效果也不会太好。不太可能一个写代码还得配一个保姆,所以就像 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.csdahua.cn/qtweb/news26/312676.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网