一、整形溢出

JAVA中,基本数据类型中,短整型为2个字节,整型为4个字节,长整型为8个字节,但是首位都为符号位,1为负,0为正。当计算产生进位到符号位时,数字会由整数变为负数,这种情况就叫做整型溢出,如:

public class Demo7 {
	public static void main(String[] args) {
		int a = 1000000000;
		int b = 1000000000;
		System.out.println(a*b);
	}
	
}

两个整数相乘,结果如下:

Java 整型数据溢出的程序实例 java整数运算符溢出_Java 整型数据溢出的程序实例

这就是因为计算进位,将符号位的“0”变为了“1”,此时,解决的方法如下:

1.如果运算结果不超过long型,可以用long格式去接收int型。

2.通常情况下,运算中,有一个是由程序定义的,因此只需要限制该数的输入范围(也称最大值、临界值)。

3.如果用户输入的都是字符串,则限制字符串的长度。

4.通过biginteger进行运算。

如下:

import java.math.BigInteger;

public class Demo7 {
	public static void main(String[] args) {
		BigInteger a = new BigInteger("100000000000000000");
		BigInteger b = new BigInteger("100000000000000000");
		System.out.println(a.multiply(b));
	}
	
}

输出结果如下:

Java 整型数据溢出的程序实例 java整数运算符溢出_上传_02

除此之外,还有浮点数溢出,字符型溢出。

二、危险标签屏蔽

对web提交上来的查询或者上传的文件,需要判断他是否进行正常查询或者上传的正常文件。

1.标签屏蔽

在屏蔽标签时,如果检测到存在如JS的标签如:<script>,最好的办法不是将script替换为空,如果对方上传的是<scscriptript>,在屏蔽一次script后,依然不会影响到执行,所以是采取将其替换为“*”的方式。如果对方采用大小写,中间加空格的方式,都需要考虑到。

使用到的命令为:string.replaceALL("script","*");//将字符串“string”中的”script“替换为”*“

具体流程如下:

先检测字符串中是否有”(空格符)“,”(制表符即tab)“,如果存在则替换为无;

再将输入的文字,通过命令”sting.toLowerCase();“全部转换为小写;

再将关键字替换为”*“即可。

代码如下:

public class Demo8 {
	public static void main(String[] args) {
		String a = "<Sc r ScR ip	Tip	t>";
		
		a = a.replaceAll(" ","");
		a = a.replaceAll("	","");
		a = a.toLowerCase().replace("script", "*");
		System.out.println("替换后的输入:"+a);
		
	}
}

输出如下:

Java 整型数据溢出的程序实例 java整数运算符溢出_字符串_03

实际过程中,还有相对简单的方式,通过”string.contains("char")“检测字符串中是否有特殊字符,如果检测到特殊字符,不予运行,并弹出警告提示即可。

2.上传文件检测

在上传文件时,通过会对上传的文件进行限制,如:只能上传图片的服务,就需要检测文件是否以”.jpg“结尾,如果此时我们依然通过”.contains()“检测,上传者如果使用”1.jpg.exe“等方式绕过检测。所用我们需要使用string.endswith(".jpg");检测是否以".jpg"结尾。

除此以外,还需要建立上传白名单,如图片,就只允许“.jpg,.jpeg,.png等”上传。