網路安全-已解密的登入請求,會話標識未更新,跨站點請求偽造
這些沒有那麼麻煩,一天就搞定了。所以簡單記錄一下。
已解密的登陸請求是非常簡單的,隨便找個瀏覽器,火狐谷歌都行。開啟F12找到網路
就可以非常清楚的看到這裡是明文密碼。雖然這裡是客戶端,還沒有到傳輸階段,這裡的明文密碼也是非常危險的。
這裡使用抓包工具抓包,也是得到相同的結果,密碼是明文。
經過度孃的千般指點,得到3個方法:
1,使用SSL加密,就是給網站增加https。這種辦法風險低,而且只需要改配置,不需要修改程式,非常簡單。
2,使用安全控制元件,就是各大網銀,淘寶,之類的安全控制元件。這種控制元件風險更小,只是實現起來複雜度高。
3,前端做不可逆加密。
我的首選是https加密,但是,因為和使用HTTP動詞篡改的認證旁路
安全控制元件在本公司使用的概率小,不能自己開發一個加密演算法,所以也放棄了。
這裡需要感謝 CSDN使用者aqwe23共享的MD5加密檔案 MD5.js
我在前端做了md5加密,所以比明文密碼要相對來說要安全一點。
document.forms[0].onsubmit = function(e) {
var password = document.forms[0].password.value;
document.forms[0].password.value = hex_md5(password);
}
我們公司登陸這裡做的還是比較好的,加密演算法有2層,使用md5加密之後還有個加密演算法,才存入到資料庫。
會話標識未更新
我從沒想過會遇到這個問題,還是度娘解惑。這個問題引起的原因非常簡單,struts在登陸之後往cookis之中寫入了一個叫JSESSIONID值。這個值用來尋找伺服器的sessionid,經過我多方對比發現這個值和sessionid完全不一樣。我說我明明在登陸後建session重置了,怎麼還會有這個問題。這個問題根本就不是session的問題,只是對於cookies的標識的問題。所以伺服器後端完全沒必要重置session只需要將JSESSIONID值更改即可。
<span style="white-space:pre"> </span>/** * 設定當前Session到Cookie中 * @param request * @param response */ public static void setCookiesByJsessionid(HttpServletRequest request, HttpServletResponse response) { Cookie[] cookies = request.getCookies(); //先檢查是否存在JSESSIONID boolean flag = true; for(int i=0;i<cookies.length;i++) { Cookie c = cookies[i]; if("JSESSIONID".equals(c.getName())) { c.setValue(request.getSession(true).getId()); response.addCookie(c); flag = false; } } //如果不存在JSESSIONID就新增一個 存活期為1個月 if(flag) { //存活期為一個月 (日*時*分*秒) int maxAge = 30 * 24 * 60 * 60; Cookie cookie = new Cookie("JSESSIONID", request.getSession(true).getId()); cookie.setMaxAge(maxAge); response.addCookie(cookie); } System.out.println("Cookie已經儲存: JSESSIONID=" + request.getSession(true).getId()); }
在登陸完成呼叫此方法即可,我這裡是將jsessionid改成了和sessionid一樣,各位可以根據需要修改。
跨站點請求偽造
去年就解決過了跨站點的各種問題,這裡怎麼又冒出來一個,回頭看下自己的過濾器,沒發現配置少啊,然後諮詢安全檢查的相關人員,原來只是referer頭的問題。
/**
* 檢查標頭檔案
* @param request
* @param response
* @return 標頭檔案符合標準則返回false 不符合標準則為true
*/
private boolean checkReferer(HttpServletRequest request,HttpServletResponse response) {
String referer = request.getHeader("referer");
if(null==referer)
{
return false;
}else if(referer.startsWith("http://"+service_name)||referer.startsWith("https://"+service_name))
{
return false;
}
return true;
}
添加了一個Referer頭的方法,搞定,service_name這個是在配置檔案中的設定,大家自行修改。這裡的驗證其實還是太簡單了一些,下次改成正則,或者會安全一點。