近期,公司用fortify掃描項目,出現了很多的安全性問題,由於之前也沒有接觸過,網上的資料又比較少,一時間很是棘手,今天算是全部弄完了,順便總結一下,也讓其他人借鑒一下,少走些彎路.
1 Unreleased Resource: Streams
原因:出現這個漏洞的原因就是有時候流沒有關閉,比如說創建流和關閉流之間,如果這段代碼出現問題拋出異常則會沒有關閉
方案:把關閉流的代碼放入(try catch )finally中,即使出現異常也會關閉.
2. Cross Site Scripting
原因:這個就很多了,包括sql注入,也有可能是java向js中傳參等原因,這里只介紹向js中傳參
方法:StringEscapeUtils工具類,他有escapeJava();escapeJavaScript();escapeXml();等多種方法對傳入的參數進行轉義從而可以避免
3.path manipulation
原因:在拼接路徑的時候可能會被加入../等字符,導致可以訪問其他位置,對其他文件進行操作.
方法:1.替換.. replace("..","");
2.白名單方法 下面是白名單方法(網上的一段,大家可以修改),如果路徑中有其他字符也可以加進去,如果把.加進去就必須做判斷了,目的是把..過濾掉
加replace("..","");
HashMap<String, String> map = new HashMap<String, String>();
map.put("a", "a");
map.put("b", "b");
map.put("c", "c");
map.put("d", "d");
map.put("e", "e");
map.put("f", "f");
map.put("g", "g");
map.put("h", "h");
map.put("i", "i");
map.put("j", "j");
map.put("k", "k");
map.put("l", "l");
map.put("m", "m");
map.put("n", "n");
map.put("o", "o");
map.put("p", "p");
map.put("q", "q");
map.put("r", "r");
map.put("s", "s");
map.put("t", "t");
map.put("u", "u");
map.put("v", "v");
map.put("w", "w");
map.put("x", "x");
map.put("y", "y");
map.put("z", "z");
map.put("A", "A");
map.put("B", "B");
map.put("C", "C");
map.put("D", "D");
map.put("E", "E");
map.put("F", "F");
map.put("G", "G");
map.put("H", "H");
map.put("I", "I");
map.put("J", "J");
map.put("K", "K");
map.put("L", "L");
map.put("M", "M");
map.put("N", "N");
map.put("O", "O");
map.put("P", "P");
map.put("Q", "Q");
map.put("R", "R");
map.put("S", "S");
map.put("T", "T");
map.put("U", "U");
map.put("V", "V");
map.put("W", "W");
map.put("X", "X");
map.put("Y", "Y");
map.put("Z", "Z");
map.put(":", ":");
map.put("/", "/");
map.put("\\", "\\");
String temp = "";
for (int i = 0; i < path.length(); i++) {
if (map.get(path.charAt(i)+"")!=null) {
temp += map.get(path.charAt(i)+"");
}
}
path = temp;
File proFile = new File(path);
4.序列化問題
這個最簡單,相關類實現serializable接口就可以了