一、整形溢出
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);
}
}
两个整数相乘,结果如下:
这就是因为计算进位,将符号位的“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));
}
}
输出结果如下:
除此之外,还有浮点数溢出,字符型溢出。
二、危险标签屏蔽
对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);
}
}
输出如下:
实际过程中,还有相对简单的方式,通过”string.contains("char")“检测字符串中是否有特殊字符,如果检测到特殊字符,不予运行,并弹出警告提示即可。
2.上传文件检测
在上传文件时,通过会对上传的文件进行限制,如:只能上传图片的服务,就需要检测文件是否以”.jpg“结尾,如果此时我们依然通过”.contains()“检测,上传者如果使用”1.jpg.exe“等方式绕过检测。所用我们需要使用string.endswith(".jpg");检测是否以".jpg"结尾。
除此以外,还需要建立上传白名单,如图片,就只允许“.jpg,.jpeg,.png等”上传。