欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java安全编码指南之:表达式规则说明

程序员文章站 2022-06-15 12:00:05
简介在java编写过程中,我们会使用到各种各样的表达式,在使用表达式的过程中,有哪些安全问题需要我们注意的呢?一起来看看吧。注意表达式的返回值我们在使用jdk库的时候,一定要注意认真的读一下jdk中方...

简介

在java编写过程中,我们会使用到各种各样的表达式,在使用表达式的过程中,有哪些安全问题需要我们注意的呢?一起来看看吧。

注意表达式的返回值

我们在使用jdk库的时候,一定要注意认真的读一下jdk中方法的含义和它的返回值。

有些返回值可能表示这个操作是否成功,有的返回值可能是方法操作的结果。我们看两个常见的例子:

先看一个文件删除的例子,delete方法是有返回值的,所以我们在调用delete方法之后,一定要判断一下返回值,看是否删除成功。

再看一个常见的string中字符替换的例子:

我们要记住,string是不可变的,所以它的replace方法,会返回一个替换过后的string,但是原string是不变的,所以我们需要将返回值重新赋值。

注意避免nullpointerexception

nullpointerexception应该是最最常见的运行时异常了。怎么避免这个异常呢?

我们要做的就是在调用object的方法时候,一定要判断这个object是不是为空。

在jdk8之后,我们引入了stream操作:

stream操作的过程中,我们需要注意stream中的元素是否为空。

有时候,我们可能觉得已经判断是为空了,但是条件判断不准确,导致未知的异常,看下面这个例子:

这个例子是用来查找collection中到底有多少元素和object相同,如果两者都为空,也记为相同。

但是上面的例子有一个漏洞,它没有考虑element ==null 而 object !=null的情况,所以会导致nullpointerexception的生成。

我们需要这样修改:

数组相等的判断

如果我们需要比较两个数组是否相等,其实我们想比较的是两个数组中的元素是否相等。

我们知道数组是一个特殊的object,那么数组对象也有一个equals方法,考虑下面的例子:

返回的结果是false,因为数组直接使用了object中定义的equals方法,我们看下该方法的定义:

可以看到,该方法比较的是两个地址是否相等。所以我们的到了false结果。

其实,我们可以使用arrays.equals工具类中的方法来进行两个数组的比较:

基础类型的封装类间的比较

在java中,我们知道有一些基础类型像boolean, byte,char, short, int他们会有相对应的封装类型:boolean,byte,character,short,integer等。

我们可以直接将基础类型的值赋值给封装类型,封装类型会自行进行转换。

考虑下面的例子:

结果是多少呢?

答案是true。为什么两个不同对象的比较会是true呢?

在回答这个问题之前,我们看一下字符串的比较:

这个我们大家应该都知道,因为string有一个字符串常量池,直接从字符串常量构建的string对象,其实是同一个对象。

同样的对于boolean和byte来说,如果直接从基础类值构建的话,也是同一个对象。

而对于character来说,如果值的范围在\u0000 to \u007f,则属于同一个对象,如果超出了这个范围,则是不同的对象。

对于integer和short来说,如果值的范围在-128 and 127,则属于同一个对象,如果超出了这个范围,则是不同的对象。

再考虑下面的例子:

输出的结果是false,因为boolc使用了new关键字,构建了一个新的对象。

集合中类型不匹配

现在java集合可以通过指定类型,从而只存储特定类型的对象。考虑下面的一个例子:

上面代码我们定义了一个short的集合,然后将0-9添加进去,接着我们又调用了remove方法把i从集合删除。

但是最后输出结果是10,表明我们并没有删除成功。为什么呢?

看下hashset的remove方法:

remove方法的参数是object,我们传入的i是int类型的,跟short不匹配,所以导致删除失败。

我们需要这样修改:

asset的副作用

我们会使用asset语句在代码中做调试使用,在使用的过程中需要注意asset语句不要对系统的业务逻辑产生副作用,也就是说即使asset语句不运行,也不会修改代码的业务逻辑。

看下面的例子:

上的代码我们从list中删除第一个元素,并判断删除的元素是否大于0.

上面的代码如果assert语句不执行的话,会导致业务逻辑也不执行,所以需要修改成下面这样:

本文的例子:

补充知识:slow http denial of service attack 漏洞解决

解决漏洞需要修改tomcat conf 下 server.xml 文件

<connector port="8080" protocol="http/1.1" connectiontimeout="2000" redirectport="8443" uriencoding="utf-8"/> connectiontimeout="20"

以上这篇java安全编码指南之:表达式规则说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

相关标签: java 表达式