1. 程式人生 > >網路安全-已解密的登入請求,會話標識未更新,跨站點請求偽造

網路安全-已解密的登入請求,會話標識未更新,跨站點請求偽造

這些沒有那麼麻煩,一天就搞定了。所以簡單記錄一下。

已解密的登陸請求是非常簡單的,隨便找個瀏覽器,火狐谷歌都行。開啟F12找到網路


就可以非常清楚的看到這裡是明文密碼。雖然這裡是客戶端,還沒有到傳輸階段,這裡的明文密碼也是非常危險的。

這裡使用抓包工具抓包,也是得到相同的結果,密碼是明文。

經過度孃的千般指點,得到3個方法:

1,使用SSL加密,就是給網站增加https。這種辦法風險低,而且只需要改配置,不需要修改程式,非常簡單。

2,使用安全控制元件,就是各大網銀,淘寶,之類的安全控制元件。這種控制元件風險更小,只是實現起來複雜度高。

3,前端做不可逆加密。

我的首選是https加密,但是,因為和使用HTTP動詞篡改的認證旁路

遇到一樣的問題。所以我https並沒有新增成功。

安全控制元件在本公司使用的概率小,不能自己開發一個加密演算法,所以也放棄了。

這裡需要感謝 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加密之後還有個加密演算法,才存入到資料庫。

在改寫驗證登陸演算法之後我實現了登陸。如果有人使用的不是md5加密,把js換成對應的加密方式即可。

會話標識未更新

我從沒想過會遇到這個問題,還是度娘解惑。這個問題引起的原因非常簡單,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這個是在配置檔案中的設定,大家自行修改。這裡的驗證其實還是太簡單了一些,下次改成正則,或者會安全一點。