java编码安全总结

1、SQL注入
通过:select * fromtb_userwhere name='special' or '1' = '1' ANDpwd='123
           那么:如果special有效则不会判断密码。
           同理:select * fromtb_userwhere name='' andpwd=''or '1'='1'
           则:'1'='1'永远成立,攻击者不需要正确的用户名或密码就能登录
解决方案:采用预处理PrepareStaement执行sql语句而使用Statement
           Statement用于执行静态sql语句。在执行时,必须指定一个事先准备好的sql语句。
           PrepareStatement是预编译的sql语句对象,sql语句被预编译并保存在对象中。被封装的sql语句代表某一类操作,语句中可以包含动态参数“?”,在执行时可以为“?”动态设置参数值。使用PrepareStatement对象执行sql时,sql被数据库进行解析和编译,然后被放到命令缓冲区,每当执行同一个PrepareStatement对象时,它就会被解析一次,但不会被再次编译。在缓冲区可以发现预编译的命令,并且可以重用。

2、XML注入
以下描述一个商品的价格
<item>
<price>500.0</price>
<area>1</area>
</item>
恶意用户要修改如上的价格可以直接在area中输入
1</area><price>100.0</price><area>1来代替1,从而修改商品的价格.
解决方案:在在之前用正则表达式进行对数字的验证
		if(Pattern.matches("[0-9]+", quantity)) {
			
		}
		String xmlString;
		xmlString = "<item>\n<description>widget</description>\n"
				+ "<price>500</price>\n" + "<quantity>" + quantity
				+ "<quantity></item>";
		outStream.write(xmlString.getBytes());
		outStream.flush();

3、敏感数据的泄露
因为可以通过反编译命令javap -c看到代码中原有的敏感数据。
解决方案:通过.txt文本先保存数据,然后用数据流的方式把它们再写入代码中去。

4、Integer的自动拆装箱的陷阱
Integer a=10,b=10,c=200,d=200,
1)System.out.println(a == b); 
2) System.out.println(c == d);  
直接上结论:
1、(整型数-128到127的值比较问题),在进行自动拆装箱时,编译器会使用Integer.valueof()来创建Integer实例,
      从常量缓存池直接拿值出来比较,所以1)返回的是true。
2、超过这个范围的会new一个整型的值出来比较,所以2)用==于会返回false;
因此如果要比较两个对象的内容是否相同,尽量不使用== 或者!= 来比较,应该使用equal()来实现。


 






  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值