月度归档:2013 年十二月

URLConnection

代码:

  HttpURLConnection conn = null;
  InputStream is = null;
  OutputStream os = null;
  try {
   conn = (HttpURLConnection) new URL(url).openConnection();
   is = conn.getInputStream();
 // code
  } catch (MalformedURLException e) {
  } catch (IOException e) {
  } finally {
   try {
     if (conn != null)
       conn.disconnect();
     if (is != null)
      is.close();
   } catch (IOException e) {
   }
  }
 

在linux下,当连接数多的时候会发现有很多CLOSE_WAIT的连接。windows下好像会好些。

这种情况是因为:在http1.1中所有的conntection默认都是persist Connection(keep-alive)。当Connection.getInputStream() close后,HTTP protocol handler会试图去清理Connection,成功的话会将conntection放入connection缓存,以便下次能重复利用。

修改默认keep-alive:

System.setProperty("http.keepAlive", "false");

修改connection缓存机制:

connection.setUseCaches(false);

参考:Persistent Connections

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6367268

http://stackoverflow.com/questions/4767553/safe-use-of-httpurlconnection

http://hea-www.harvard.edu/~fine/Tech/addrinuse.html

Reflected XSS All Clients漏洞

XSS的全称是Cross Site Scripting,跨站脚本

这第一个单词是Cross,为什么缩写成X呢?因为CSS是层叠样式表的缩写(Cascading Style Sheets)的缩写,同时Cross发音和X相似,为了避免混淆用X来代替,缩写成XSS。

XSS的原理就是往HTML中注入脚本.

三种方式:

1,直接注入

<script>

//code

</script>

2,通过img,a等支持的src属性的标签注入:

 

<img src="javascript://code"/>

3,通过dom的事件注入:

 

<img src="errorsrc" onerror="//code"/>

转码注入:

 

1,HTML编码可以用&#ASCII方式来写,这种XSS转码支持10进制和16进制,SQL注入转码是将16进制字符串赋给一个变量,而XSS转码则是针对属性所赋的值

<img src="javascript:alert('xss')"/>

转义后:

 

<img src="&amp;#106&amp;#97&amp;#118&amp;#97&amp;#115&amp;#99&amp;#114&amp;#105&amp;#112&amp;#116&amp;#58&amp;#97&amp;#108&amp;#101&amp;#114&amp;#116&amp;#40&amp;#39&amp;#104&amp;#101&amp;#108&amp;#108&amp;#111&amp;#32&amp;#119&amp;#111&amp;#114&amp;#100&amp;#39&amp;#41"/>

这个&#分隔符还可以继续加0变成“&#0106” ,“&#00106” ,“&#000106” ,“&#0000106”等形式。

 

2,我们的JavaScript中的”\”字符是转义字符,所以可以使用”\”连接16进制字符串运行代码,样式表也支持分析和解释”\”连接的16进制字符串形式,浏览器能正常解释:


<style>
BODY { background: url("javascript:alert('xss'))") }
</style>

转移后:

 


<style>
BODY { background: \75\72\6c\28\68\74\74\70\3a\2f\2f\31\32\37\2e\30\2e\30\2e\31\2f\78\73\73\2e\67\69\66\29 }
</style>

参考:浅析XSS(Cross Site Script)漏洞原理

 

关于findBugs的几个问题

1,Method returning array may expose internal repersentation

一个静态的公共函数,它返回了一个私有的静态数组的引用。任何调用这个静态公共函数的代码,都有可能改变这个私有的静态数组。实例代码如下:

Public String[] getArr(){
return arr;
}

这样get获取到这个数组后,可以改变数组的内容,如getArr()[0]=”abc”;

解决办法是返回他的clone:

Public String[] getArr(){

return arr.clone();

}

2,Storing reference to mutable object

这是因为set设置了一个对象后,还可以通过这个对象的引用改变该对象set的值:

public class Test{

private Date regDate;

public void setRegDate(Date regDate) {
this.regDate = regDate;
}

}&lt;/pre&gt;
&amp;nbsp;
&lt;pre title=&quot;&quot;&gt;Test t=new Test();

Date now = new Date();

t.setRegDate(now);

now.setYear(4000);

解决办法是set赋值对象的clone:

public class Test{

private Date regDate;

public void setRegDate(Date regDate) {
this.regDate = regDate.clone();
}

}

参考:

[hyddd的FindBugs分析记录][M V EI2] May expose internal representation by incorporating reference to mutable object

[hyddd的FindBugs分析记录][M V MS] Public static method may expose internal representation by returning array