热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

这篇文章主要介绍了java安全编码指南之:表达式规则说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

简介

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

注意表达式的返回值

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

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

 public void deleteFileWrong(){
  File file= new File("/tmp/www.jb51.net.txt");
  file.delete();
  System.out.println("File delete success!");
 }

 public void deleteFileRight(){
  File file= new File("/tmp/www.jb51.net.txt");
  if(file.delete()){
   System.out.println("File delete success!");
  }
 }

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

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

 public void stringReplaceWrong(){
  String url="www.jb51.net";
  url.replace("www","WWW");
  System.out.println("replaced url..."+url);
 }
 public void stringReplaceRight(){
  String url="www.jb51.net";
  url=url.replace("www","WWW");
  System.out.println("replaced url..."+url);
 }

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

注意避免NullPointerException

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

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

在JDK8之后,我们引入了Stream操作:

 public void streamWrong(Collection collection){
  collection.stream().filter(obj->obj.equals("www.jb51.net"));
 }

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

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

 public int countWrong(Collection collection, Object object){
  int count=0;
  if(collection ==null){
   return count;
  }
  for(Object element: collection){
   if((element ==null && object== null)
    || element.equals(object)){
    count++;
   }
  }
  return count;
 }

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

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

我们需要这样修改:

 public int countRight(Collection collection, Object object){
  int count=0;
  if(collection ==null){
   return count;
  }
  for(Object element: collection){
   if((element ==null && object== null)
     || (element !=null && element.equals(object))){
    count++;
   }
  }
  return count;
 }

数组相等的判断

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

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

 public boolean compareWrong(){
  int[] array1 = new int[10];
  int[] array2 = new int[10];
  return array1.equals(array2);
 }

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

 public boolean equals(Object obj) {
  return (this == obj);
 }

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

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

 public boolean compareRight(){
  int[] array1 = new int[10];
  int[] array2 = new int[10];
  return Arrays.equals(array1, array2);
 }

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

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

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

考虑下面的例子:

  Boolean boolA=true;
  Boolean boolB=true;
  System.out.println(boolA==boolB);

结果是多少呢?

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

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

  String stringA="www.jb51.net";
  String stringB="www.jb51.net";
  System.out.println(stringA==stringB);

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

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

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

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

再考虑下面的例子:

Boolean boolA=true;
Boolean boolC=new Boolean(true);
System.out.println(boolA==boolC);

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

集合中类型不匹配

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

 public void typeMismatch(){
  HashSet shortSet= new HashSet<>();
  for(int i=0;i<10;i++){
   shortSet.add((short)i);
   shortSet.remove(i);
  }
  System.out.println(shortSet.size());
 }

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

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

看下HashSet的remove方法:

 public boolean remove(Object o) {
  return map.remove(o)==PRESENT;
 }

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

我们需要这样修改:

 public void typeMatch(){
  HashSet shortSet= new HashSet<>();
  for(int i=0;i<10;i++){
   shortSet.add((short)i);
   shortSet.remove((short)i);
  }
  System.out.println(shortSet.size());
 }

Asset的副作用

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

看下面的例子:

 public void assetWrong(ArrayList list){
  assert list.remove(0)>0;
 }

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

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

 public void assetRight(ArrayList list){
  int result=list.remove(0);
  assert result>0;
 }

本文的例子:

learn-java-base-9-to-20/tree/master/security

补充知识:Slow HTTP Denial of Service Attack 漏洞解决

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

cOnnectionTimeout="20"

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


推荐阅读
  • 基于Spring Boot的家政服务平台毕业设计项目(含源代码)
    本文档介绍了如何搭建和运行一个基于Spring Boot的家政服务平台,旨在为计算机专业学生提供毕业设计参考。项目涵盖了从环境配置到核心功能实现的全过程。 ... [详细]
  • 本文探讨了使用Filter作为控制器的优势,以及Servlet与Filter之间的主要差异。同时,详细解析了Servlet的工作流程及其生命周期,以及ServletConfig与ServletContext的区别与应用场景。 ... [详细]
  • Java EE CDI:解决依赖关系冲突的实例
    在本教程中,我们将探讨如何在Java EE的CDI(上下文和依赖注入)框架中有效解决依赖关系的冲突问题。通过学习如何使用限定符,您将能够为应用程序的不同客户端提供多种接口实现,并确保每个客户端都能正确调用其所需的实现。 ... [详细]
  • ServletContext接口在Java Web开发中扮演着重要角色,它提供了一种方式来获取关于整个Web应用程序的信息。通过ServletContext,开发者可以访问初始化参数、共享数据以及应用资源。 ... [详细]
  • Flowable 6.6.0 表单引擎在Web应用中的集成与使用
    本文档提供了Flowable 6.6.0版本中表单引擎在Web应用程序中的配置和使用指南,包括表单引擎的初始化、配置以及在Web环境下的具体实现方法。 ... [详细]
  • 本文探讨了在渗透测试中信息收集阶段使用的几种端口扫描技术,包括nmap、masscan、socket、telnet及nc等工具的应用与比较。 ... [详细]
  • 近期,谷歌公司的一名安全工程师Eduardo Vela在jQuery Mobile框架中发现了一项可能引发跨站脚本攻击(XSS)的安全漏洞。此漏洞使得使用jQuery Mobile的所有网站面临潜在的安全威胁。 ... [详细]
  • 探讨GET与POST请求数据传输的最大容量
    在Web开发领域,GET和POST是最常见的两种数据传输方法。本文将深入探讨这两种请求方式在不同环境下的数据传输能力及其限制。 ... [详细]
  • 使用Jenkins构建Java项目实践指南
    本指南详细介绍了如何使用Jenkins构建Java项目,包括环境搭建、工具配置以及项目构建的具体步骤。 ... [详细]
  • 本文介绍了Kettle资源库的基本概念、类型及其管理方法,同时探讨了Kettle的不同运行方式,包括图形界面、命令行以及API调用,并详细说明了日志记录的相关配置。 ... [详细]
  • 本文详细介绍了如何在Spring Boot项目中配置Maven的pom.xml文件,包括项目的基本信息、依赖管理及构建插件的设置。 ... [详细]
  • Pikachu SQL注入实战解析
    作为一名网络安全新手,本文旨在记录个人在SQL注入方面的学习过程与心得,以备后续复习之用。通过逐步深入的学习,力求掌握每个知识点后再向下一个挑战迈进。 ... [详细]
  • JSP服务器概述及搭建指南
    本文详细介绍了JSP服务器的概念、主流服务器软件及其搭建步骤,旨在帮助开发者更好地理解和使用JSP技术。 ... [详细]
  • 开发笔记:小程序分类页实现三级分类,顶部导航栏,左侧分类栏,右侧数据列表
    开发笔记:小程序分类页实现三级分类,顶部导航栏,左侧分类栏,右侧数据列表 ... [详细]
  • 本文详细介绍了Oracle数据库中审计日志(audit trail)的配置方法及各参数选项的功能,包括如何启用系统范围的审计记录,以及如何将审计数据存储在不同的位置和格式。 ... [详细]
author-avatar
慈悲的残忍
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有