代码审计工具Findbugs自动检查CheckList及配置方法 - 图文

更新时间:2023-10-09 05:37:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

代码审计工具Findbugs自动检查CheckList及配置方法

代码审计工具Findbugs是一个应用比较广泛的开源代码审计工具,如果开发团队利用好了这个工具,能够很大程度上提高软件产品的安全性。而且重要的是Free。

首先,介绍一下安全审计配置文件的位置,网上都没有这方面的资料,我自己找了几个小时才找到。这个配置文件不在安装文件夹,也不再Eclipse软件的文件夹,而是在具体项目的工作空间workspace中,具体位置是:workspace\\.metadata\\.plugins\\edu.umd.cs.findbugs.plugin.eclipse\\.fbprefs。(以点开始的文件夹,还这么多层目录,很隐蔽!!!)

这个文件中,选中要审计的项目其配置值会是“TURE”,配置为不审计的项会是“FALSE”。我们可以通过在工作中逐渐确定哪些安全项一定要检查,哪些不需要检查,确定之后,整个开发团队使用同一个配置文件,从而实现标准化、自动化地审查开发团队的代码。 其次,介绍一下Findbugs的大类,为如下几种: Malicious code 恶意代码 小问题 不好的习惯 无效代码 代码的正确性 国际化问题 性能问题 安全性问题 线程问题 实验性问题 vulnerability Dodgy Bad practice Bogus random noise Correctness Internationalization Performance Security Multithreaded currectness Experrimental

第三,介绍一下Findbugs的常见检查项的意思: 关键字 BC BC BC BC_UNCONFIRMED_CAST BC_IMPOSSIBLE_CAST 规则名 DMI_RANDOM_USED_ONLY_ONCE Bx Bx Bx DM_BOXED_PRIMITIVE_TOSTRING DM_BOXED_PRIMITIVE_TOSTRING DM_NUMBER_CTOR 错误信由于没有进行类型检查, 可ClassCastException。推荐来对是否可以类型变换进行因为不相关的类型之间的类请检查相关的代码。 在使用类java.util.Random的随机数比较容易预测, 所java.security.SecureRand进行字段的同步的时候、得object的lock。字段的値变有的字段的値肯定是不一样更新。 使用static 方法toString因为Number 构造函数的效法valueOf。 CN CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE CN CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE DB DB_DUPLICATE_BRANCHES DB DB DE DLS DB_DUPLICATE_SWITCH_CLAUSES DB_DUPLICATE_BRANCHES DE_MIGHT_IGNORE DLS_DEAD_LOCAL_STORE DLS DLS_DEAD_STORE_OF_CLASS_LITERAL DLS DLS Dm Dm Dm DLS_DEAD_LOCAL_STORE DLS_DEAD_STORE_OF_CLASS_LITERAL DM_BOOLEAN_CTOR DM_EXIT DM_STRING_CTOR Dm DM_STRING_TOSTRING Dm DM_STRING_VOID_CTOR switch文中、有相同的cod有可能使oding的miss。请codingmiss的话、修改code为了避免重複,建议改一下虽然定义了方法clone,但Cloneable,推荐在类的宣言不能直列化的object被保存sessionobject的containe有可能不能正常运转。所以object。 switch 中有相同的代码。可能是编码错误。推荐对该代码修改代码,如果是代码重复分支语句中的代码是相同的支语句的判断。 有异常被捕获但是没有进行现在进行 方法String.inde較、但是 等于或者大于0(>以建议重新检查前後的源码不是volatile的static字化。Compiler以及、proces如果方法同时从複数的线程段的时候、可能会出现可以instance的危险。通过 对于对于初期化bloc进行同步、局部变量被赋值,但是之后不对该局部变量赋值。 java.lang.Class 的实例被例不会被使用,推荐删除该用multi线程同時更新的时所以建议重新检查。 因为被参照的是可能为null之前进行null的验证。 现在是调用没有被写入的字议重新检查関連的源代码。(&或者|)和(&&或者||)的使一定会对于両側的公式进行的使用为(&或者|)的话、不符的左側的公式成为 为了访会出现error。建议检察co修正(&&或者||)。 正規表現的文法错了。这个PatternSyntaxException的表現的写法。 Dm Dm Dm Dm Dm DMI EC DM_EXIT DM_BOOLEAN_CTOR DM_STRING_CTOR DM_STRING_TOSTRING DM_STRING_VOID_CTOR DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY EC_ARRAY_AND_NONARRAY EC EC EC EC_NULL_ARG EC_UNRELATED_CLASS_AND_INTERFACE EC_UNRELATED_TYPES ES ES_COMPARING_PARAMETER_STRING_WITH_EQ ES ES IC IJU IL IL ES_COMPARING_STRINGS_WITH_EQ ES_COMPARING_PARAMETER_STRING_WITH_EQ IC_INIT_CIRCULARITY IJU_SETUP_NO_SUPER IL_INFINITE_LOOP IL_INFINITE_RECURSIVE_LOOP System.exit 会使VM整体终用的地方。这样的code、会RuntimeException进行thr使用方法valueOf()比使用Boolean 对象更有效率,所因为使用String(String)内存,推荐使用原有字符串由于类型变换前后的类型都型变换。 生成空字符串时使用了new 赋值空字符串「\」的效率较toString将引起一个无用的Arrays.toString转换。 因为数组类型的对象和非数是false,这样的比较没有检查。 传入方法equals()的参数值是false。这种情况下,使用荐检查相关代码。 因为可能是编码上的错误,用方法equals 对不相关类false。这样没有意义的方法误造成的,所以推荐检查相直列化可能的class中,存transient、并且不是static没有实现interfaceExternareadObject和writeObject正确进行。建议重新检查関由于对象值的比较中,应该用方法equals。 以「==」或者「!=」进行St较parameter的値的时候、议修正为使用方法equals。因为初始化处理中会产生死码。 继承了测试类和方法。设定因为循环条件一直是true,常。推荐检查相关代码。 无条件地对自身调用。因为所以推荐检查相关的代码。IP IP ITA J2EE J2EE LI LI LI LI ML ML Nm Nm NP NP 在classjava.util.RandomIP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN 成的随机数很容易予測、所classjava.security.SecurIP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN 由于对参数的修改会被忽视如果象「myCollection.toAFoo[myCollection.size()」ITA_INEFFICIENT_TO_ARRAY 数内部处理中不会生成新的传入和变换前Collection 的HttpSession 中有无法序列J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION Session 对象,或使Sessio执行。推荐把对象修改成可向本地变量进行了代入、后J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION 这个代入。 非volatile 的static 字段迟初始化。编译器及处理器LI_LAZY_INIT_STATIC 当多线程中同时调用时,可果。如果把字段改成volati这个问题能够被解决。 多线程同时更新的时候,可LI_LAZY_INIT_UPDATE_STATIC 以推荐检查相关代码。 在类String的方法equals(LI_LAZY_INIT_STATIC 议在方法ength(length() LI_LAZY_INIT_UPDATE_STATIC 参数的変更内容、不是覆盖用字段来作为同期的锁的时象加锁。当字段的值变化的ML_SYNC_ON_FIELD_TO_GUARD_CHANGING_THAT_FIELD 字段的值不一定相同。这种同时更新。 交给方法Collection.toArr「myCollection.toArray(nFoo[myCollection.size()」ML_SYNC_ON_FIELD_TO_GUARD_CHANGING_THAT_FIELD Collection的长度、内部的効率会提高。建议修改为把的size相同的数组交给方法NM_CLASS_NAMING_CONVENTION 未使用分配的变量,建议将根据一般的编码规范,类名NM_CLASS_NAMING_CONVENTION 第一个字符改成大写。 由于值可能是null 的对象NP_ALWAYS_NULL NullPointerException。推的检查。 方法的异常处理中, null NP_ALWAYS_NULL_EXCEPTION NullPointerException 可能的代码。 NP NP NP NP NP NP NP_UNWRITTEN_FIELD NP_TOSTRING_COULD_RETURN_NULL NP_ALWAYS_NULL NP_ALWAYS_NULL_EXCEPTION NP_LOAD_OF_KNOWN_NULL_VALUE NP_UNWRITTEN_FIELD NS NS_DANGEROUS_NON_SHORT_CIRCUIT NS ODR ODR OS OS NS_DANGEROUS_NON_SHORT_CIRCUIT ODR_OPEN_DATABASE_RESOURCE ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH OS_OPEN_STREAM OS_OPEN_STREAM_EXCEPTION_PATH RCN RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE RCN RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE RCN RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE RE RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION 没有被赋值的字段被使用。所以推荐检查相关的代码。toString方法在某些情况下能造成其他代码被破坏。建字符而不是null。 调用了値可能为null的局部NullPointerException,建null可能的变量被参照、因NullPointerException発生null check。 DB接続関連的资源没有被发例外発生時DB接続相关的资続相关的资源的処理追加到位操作符(&或|)被作为布尔操作符时,两边表达式的值作布尔操作符使用时,不仅的表达式是右边表达式的保相关的代码,如果是被误用操作符。 对象的参照明显不是null,查删除。 由于DB 连接相关的资源没处理。 由于例异常发生时DB 连接连接相关的资源释放处理追一直使用的是値为null的局代替局部变量。 由于例外发生时,流没被关追加到finally。 只是为了调用interrupted(Thread.currentThread()的static方法,因此,建议修的调用。 循环中,字符串是用StringStringBuffer连接更有効率StringBuffer。 由于当对象是null 的情况常NullPointerException 的进行null 检查。 正则表达式的文法错误。这PatternSyntaxException 的的写法。 RE RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION RI RV SA RI_REDUNDANT_INTERFACES RV_EXCEPTION_NOT_THROWN SA_LOCAL_SELF_ASSIGNMENT Se SE_BAD_FIELD Se SE_TRANSIENT_FIELD_NOT_RESTORED SF SS STCAL SF_SWITCH_FALLTHROUGH SS_SHOULD_BE_STATIC STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE STCAL STI UCF UPM UrF UwF WMI STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE STI_INTERRUPTED_ON_CURRENTTHREAD UCF_USELESS_CONTROL_FLOW UPM_UNCALLED_PRIVATE_METHOD URF_UNREAD_FIELD UWF_UNWRITTEN_FIELD WMI_WRONG_MAP_ITERATOR 目前是使用String构造器由对象,但是,由于原来的St建议不生成没用的String对象。 被实现的接口会自动的被子义实现。推荐删除该定义。异常对象被生成后,该对象错误,推荐检查相关的代码由于局部变量对自身赋值没句。 可序列化的类中,有不能序不是static 的字段。并且Externalizable , 也没定writeObject,所以序列化及在方法readObject/readRes赋值。当对象被反序列化时荐把字段改成非transient,方法eadObject/readResolvswitch 中有没被break 的一个case 语句也会被执行return来结束case 语句。final 字段在编译时会当成staticfinal。 因为类DateFormat 不是线DateFormat 类型的static 的地方,生成这个类的对象因为类SimpleDateFormat 不用SimpleDateFormat 类型使用这个类的地方,生成这因为方法interrupted()是Thread.interrupted()。 因为控制语句没被使用,推private 方法一次都没被调由于字段没被读过,推荐删由于字段没被写入过,所以取时,会使用缺省值。所以推或删除该字段。 和keySet 相比,使用entrentryKey。

本文来源:https://www.bwwdw.com/article/c6cf.html

Top