fortify代码扫描问题结果分析

2023-11-01

最近项目的代码使用fortify工具扫描了一下,发现了项目中存在的一些问题,在以后代码编写的过程中要注意,避免出现类似的错误。


以下为本次代码分析工具FORTIFY对代码的分析结果。这些问题虽然古老、简单然而经典,也是需要引起重视。

代码问题主要集中在如下类别:存在安全隐患、存在资源泄漏隐患、序列化问题、字符串比较、异常处理问题,以及其它一些BAD PRACTICE和粗心引起的问题。

 

J2EE Bad Practices: Non-Serializable Object Stored in Session (Time and State, Structural)

把一个不可序列化的对象作为 HttpSession 属性来储存会破坏应用程序的可靠性。

代码示例

 

SharerInfo sharerInfo = new SharerInfo();

getServletRequest().getSession().setAttribute( “sharerInfo”, shareInfo);

其中SharerInfo类没有实现序列化(implements java.io.Serializable)

 

分析

对于不需要将对象序列化到同一jvm以外的应用场景,以上代码没有问题。然而考虑到系统的扩展性,以上问题应该予以避免。

以下是一些常见的会导致问题的场景:

1.       session对象存储到外部系统

在一些大型应用系统的实现里,会考虑将部分SESSION里的对象钝化到数据库、磁盘里。

2.       集群环境

在非session-sticky的集群环境里,应用服务器会在集群里广播、复制session数据

修正

   ShareInfo类应该实现序列化:implements java.io.Serializable

Unreleased Resource

程序可能无法成功释放某一项系统资源

代码示例

         Try {

Connection con = jdbcTemplate.getDataSource().getConnection();

     }

         Catch(Exception e) {

   // Handle exception

}

Con.close();

分析

   系统资源比如数据库资源(Connection ,Statementetc)IO资源(InputStream,OutputStream,etc)都是有限的,如果没有正确的释放掉,就会出现资源泄漏的问题。常见的后果如出现数据库连接池无可用连接(pool exhausted),Too many open files

 修正

  将资源释放代码放到finally块中进行

Mutable static field

将业务上不可变的静态值作为非final属性直接暴露给调用者

代码示例

public static  String  REALM;

 

static {

         REALM= bundle.getMessage("realm",null,DEFAULT_LOCALE);  

}

分析

  在业务上REALM是常量。但这样直接将REAM作为非FINAL静态属性暴露给调用者,容易导致静态属性值被修外部调用者修改,从而导致系统问题。

修正

   realm定义为final类型或者通过getRealm方法暴露接口,而隐藏setRealm方法。

Dropped or ignored exception

异常不做任何处理直接忽略

代码示例

  Try {

   //handle logic

  }

           Catch (Exception e) {   }//do nothing

   分析

      将异常捕获后直接忽略是一种BAD PRACTICE.

   修正

     如果需要处理异常(比如打印异常信息),则进行处理。如果不需要,则继续抛出异常给更外层的调用者

直接将信息输出到标准输出

这是一种BAD PRACTICE。严重的情况下还会对系统性能造成冲击。

代码示例

  System.out.print

e.printStackTrace.

分析

   以上是两种常见的不被推荐的打印信息的代码例子。

修正

      虽然可以通过修改系统属性或者修改System.out的输出属性来改变System.out.print等方法的输出目标。但更建议直接禁止这种写法。

   通过LOG4JLOG工具包将信息按信息级别输出到外部系统(磁盘、数据库,甚至其它服务器比如通过JMS将日志发送给日志服务器)。

如果想获取异常堆栈信息(e.printStackTrace,可以利用如下helper代码捕获整个异常堆栈信息:

  public class StackTraceUtil {

       public static String getStackTrace(Throwable exception) {

        if (exception != null) {

            StringWriter sw = new StringWriter();

            PrintWriter pw = new PrintWriter(sw);

            exception.printStackTrace(pw);

            return sw.toString();

        } else {

return "thrown exception is null.no more exception information can provide..";

}

    }

Checking String equality using == or !=

通过==而不是equals比较字符串数据。

 

代码示例

String a=”abc”

String b=”abc”;

System.out.println(a==b)

分析

 “==”是比较指针是否指向同一地址,而equals比较的是数据。事实上除了原子类型的数据外,其它大部分情况下,值比较都应该使用equals

String是个特殊情况。为了提高效率,JVM 维护了字符串池。以上代码里定义b时,b仍然指向a的指针,而不是重新分配一块内存给b.所以虽然对于a==b来说,比较的是地址指针,但a==b仍然为true.但对于如下场景 a==b将为false:

String a= “abc”;

String b= new String(“abc”);

System.out.println (a==b).

在以上代码里 new String重新为b分配了一块内存,所以结果将是false.

修正

  使用equals进行值比较

重载方法名写错

代码示例

public int hashcode(Object o){                  

return this.a.hashCode()+this.b.hashCode();

}

分析

 以上代码本意应该是想重载ObjecthashCode(Object o)方法。但不小心些错了。对于jdk5及以后的jvm,可以通过@override在编译期发现改问题。对于jdk1.4及以前的环境,只能通过小心检查来避免这种情况。不过很多IDE工具都提供对这种常见需覆盖方法(比如hashCode,equals等)的智能化完成功能。

HTTP Response Splitting

对于XSS漏洞,通常情况下通过过滤转换<,>等敏感字符来防御。但对于http response splitting(报头分离)漏洞,还应该针对回车、换行这两个敏感字符进行过滤。

代码示例

response.addHeader("Content-Disposition", "attachment; filename="

               + fileName);

修正

   如果fileName的来源不可靠,则需要过滤\13\10(回车、换行)字符

其它

其它包括一些粗心造成的代码问题。比如对Nuberm类型的数据进行如下比较:Numbera.equals(“”)等。

   以上为本次hotwarn级别的代码分析总结,具体问题代码明细见fortify 分析结果文件。

系统安全攻击问题

   详见:http://download.csdn.net/detail/u011897392/9806386



具体问题请参见:http://blog.sina.com.cn/s/blog_62bcc50c0100g1vi.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fortify代码扫描问题结果分析 的相关文章

随机推荐

  • 小米手机解BL锁、线刷详细教程,适用于小米全系列手机

    教程 小米手机解BL锁 线刷详细教程 适用于小米全系列手机 这几天看到论坛里很多人在问怎么线刷 下面我就做个详细的线教程大家看一下高手别喷我哈 此教程只适合刷官方MIUI包 进入正题 第一步 解BL锁 1 浏览器打开申请解锁小米手机点击立即
  • CSS 入门

    CSS Cascading Style Sheets 层叠样式表 是一种用来为结构化文档 如 HTML 文档或 XML 应用 添加样式 字体 间距和颜色等 的计算机语言 CSS 文件扩展名为 css css 一般与 html 结合使用效果更
  • 【steam_api.dll下载】steam_api.dll放在哪

    弹出steam api dll文件的丢失总是让用户十分苦恼 对于初次遇到这项问题的用户来说 可能会不知如何下手 但如果你能上网查查 其实解决这项弹窗问题并不是一件多难的事 小编在后续整理的内容也将为用户们解决弹窗问题 对于一些接触电脑不久的
  • 吉林大学超星MOOC学习通高级语言程序设计 C++ 实验02 分支与循环程序设计(2021级)(1)

    由于本章节题目太多 我将分几次发布 实验02 分支与循环程序设计 2021级 一 程序题 共15题 100分 1 程序题 题目编号 Exp02 Enhance02 GJBook3 04 0102 题目名称 公式累乘 题目描述 用如下的展开式
  • 数据库表名和列名大小写问题

    在postgresql中表名列名会自动转换为全小写 如果想大小写混用或纯大写 必须要用双引号将表 列 名引起来 而在oracle中 表名和列名会自动转换为大写 如果想大小写混用或纯小写 必须用双引号将表 列 名引起来
  • 读取文件解析文件发生的错误,已解决

    错误背景 从文件服务器上面读取zip压缩文件下来 然后解压 放指定目录下 获取所有解压后文件的路径地址保存在list集合里面 最后要求是把所有获取到zip里面的pdf文件合成为一个总pdf文件 放入压缩包 上传到文件服务器上面就完成了 发生
  • 连接池自动重新连接数据库的测试

    我对数据库重启后 是否自动重新初始化连接池进行了测试 一 使用oracle数据库 1 resin 3 0 22 无需特殊配置 自动支持 2 jboss 4 0 4 GA 需加如下配置
  • 微信小程序——页面跳转

    wx switchTab Object object 跳转到 tabBar 页面 并关闭其他所有非 tabBar 页面 wx reLaunch Object object 关闭所有页面 打开到应用内的某个页面 wx redirectTo O
  • pcl::getTranslationAndEulerAngles精度缺失问题

    pcl getTranslationAndEulerAngles的功能是根据仿射矩阵计算x y z roll pitch yaw 但发现这种计算的rpy有一定的精度问题 于是进行了实验 一个是从一个四元数 根据eulerAngles计算rp
  • mobileemumaster文件夹怎么删除_origin平台加载不出游戏怎么解决?只需删除这两个文件夹...

    EA这家公司做游戏还是挺用心的 然而它的游戏平台做得实在是垃圾 跟育碧的Uplay平台比起来提鞋都不配 要不是 战地1 只能在这个平台上玩 我是绝对不会用origin这个垃圾平台的 origin平台下载游戏速度比其他平台都要慢 游戏下载慢就
  • 转:C语言头文件下包含函数(math.h stdio.h stdlib.h string.h)

    math h常用函数 int abs int x double acos double x double asin double x double atan double x double atan2 double y double x d
  • 重学JavaScript 第三天

    1 算术运算符 加 减 乘 除 取余 取余 看某些数是否被整除 优先级 先乘除取余 后加减 小括号优先级最高 2 一元运算符 前置自增 符号 num 先让自己 加1 然后再参与运算 后置自增 num 先参与运算 再自己 加1 使用场景 用于
  • 2013年12月15日

    socket mFactory createSocket host port assertNotNull socket assertNotNull socket getOutputStream assertNotNull socket ge
  • Jetbrains DataGrip 2020中文版

    教程 1 下载好文件包 得到安装程序和文件等 2 然后运行datagrip 2020 1 exe安装程序进行软件安装 3 选择软件安装路径 可更改 也可默认 4 根据用户系统位数选择版本进行创建桌面快捷方式 5 接下来一直点击next完成软
  • 网络编程项目——在线电子词典

    目录 项目要求 代码 服务器代码 客户端 运行截图 注册 首次注册 重复注册 数据库 登录 正常登录 重复登录 数据库 查询 数据库 查询历史 退出 数据库 编辑 项目要求 登录注册功能 不能重复登录 重复注册 单词查询功能 历史记录功能
  • 初始化mcu程序选用32k_程序的组成、存储与运行

    摘抄整理自 1 RT Thread编程手册 um4003 rtthread programming manual 2 野火 零死角玩转STM32 F429挑战者V2 一般 MCU 包含的存储空间有 片内 Flash 与片内 RAM RAM
  • U盘安装Win系统遇到“Windows 无法安装到这个磁盘。这台计算机的硬件可能不支持………”解决方法

    U盘安装Win系统遇到 Windows 无法安装到这个磁盘 这台计算机的硬件可能不支持 解决方法 方法1 bios里切换为Legacy启动方式 方法2 在错误提示界面 1 按下 Shift F10 快捷键 2 依次输入 diskpart 回
  • 浏览器前缀、BFC深入解析、flex布局简析、行盒line boxes对齐及vertical-align居中原理、line-height

    浏览器前缀 官方文档专业术语叫做 vendor specific extensions 供应商特定扩展 浏览器为了防止后续会修改名字给的新的属性添加了浏览器前缀 FC 格式化上下文 分为BFC IFC 元素在标准流里面都属于一个FC 块级元
  • PTA 浙大版《C语言程序设计(第3版)》题目集 练习5-3

    本题要求实现函数输出n行数字金字塔 函数接口定义 void pyramid int n 其中n是用户传入的参数 为 1 9 的正整数 要求函数按照如样例所示的格式打印出n行数字金字塔 注意每个数字后面跟一个空格 裁判测试程序样例 inclu
  • fortify代码扫描问题结果分析

    最近项目的代码使用fortify工具扫描了一下 发现了项目中存在的一些问题 在以后代码编写的过程中要注意 避免出现类似的错误 以下为本次代码分析工具FORTIFY对代码的分析结果 这些问题虽然古老 简单然而经典 也是需要引起重视 代码问题主