小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

WEB安全實(shí)戰(zhàn)(七)會(huì)話標(biāo)識(shí)未更新

 三十的狼 2019-09-06


上一篇文章中,我們討論了關(guān)于“瀏覽器記住用戶名和密碼的問題,至于這篇文章嘛,我想談?wù)勱P(guān)于“會(huì)話標(biāo)識(shí)”的漏洞。而且,這篇文章也是“Web安全實(shí)戰(zhàn)”系列的最后一篇。為什么要拿到最后來說呢,其實(shí),是之前一直困擾我的問題,這個(gè)問題曾一頓讓我抓狂,n(n=3~5)多天一直沒有解決,當(dāng)時(shí)也是搜遍了各大網(wǎng)站,各大論壇,均未找到合適的解決方案。其中的過程就不再廢話了,轉(zhuǎn)到正題。


問題


先介紹一下問題是如何發(fā)現(xiàn)的,當(dāng)然,這個(gè)不是我發(fā)現(xiàn)的,是我們測(cè)試部的童鞋發(fā)現(xiàn)的漏洞,然后她轉(zhuǎn)交給我,讓我去解決這個(gè)問題。剛開始也是一點(diǎn)思路都沒有,然后就是一頓狂搜,后來慢慢發(fā)現(xiàn),其實(shí)這個(gè)問題產(chǎn)生的根源,就是應(yīng)用服務(wù)器(如 Tomcat)的 JSessionId 沒有更新。只要使得舊的 Session 過期,重新生成新的 Session 即可。當(dāng)然,這是理論上的解決方案,很想當(dāng)然的。


曲折過程


有了思路之后,再想解決問題就容易了很多。于是,我就把范圍固定在了如何讓 Session 過期,當(dāng)然,這樣的解決方案網(wǎng)上有一籮筐,這里就不多說了,我拿到項(xiàng)目中試了試,結(jié)果你肯定能想到 —— 拋異常,異常原因是:...Session already invalidated 。這說明在程序中的某處,需要用到 Session 中的數(shù)據(jù),但是此時(shí) Session 已經(jīng)過期了,無法取到數(shù)據(jù)。

于是,我開始找是哪里用到了 Session ,遺憾的是,我沒能找到。心想,找不到 Session 我就換個(gè)思路吧,那就讓 Session 過期之前,重新生成一個(gè)新的 Session ,把舊的 Session中的數(shù)據(jù)拷貝到新產(chǎn)生的 Session 中。這樣就可以避免 Session 過期的問題了(理論上是這樣)。

到這里,如果是一般的情況,就可以解決了,不過嘛,如果你的項(xiàng)目中還加入了安全框架 Shiro ,那么在 Session 的處理上,會(huì)有一些麻煩,因?yàn)?Shiro 也會(huì)有自己的 Session ,而且在認(rèn)證的時(shí)候,Shiro 會(huì)有一些處理 Session 的操作,這就是導(dǎo)致 ...Session already invalidated 的原因所在。后來試了幾種把舊 Session 數(shù)據(jù)轉(zhuǎn)新 Session 數(shù)據(jù)的方案也不好使。


最終方案


一個(gè)偶然的機(jī)會(huì),在網(wǎng)上找到了一篇《會(huì)話標(biāo)識(shí)未更新》的文章,這篇文章就是介紹的在使用 Shiro 的情況下,如何解決這個(gè)漏洞,不過,情況不同的是,他使用的是應(yīng)用服務(wù)器是 jBoss,而我們用的則是 Tomcat,本著試一試的態(tài)度,按照他給的思路,把自己的代碼做了一下整理,把對(duì) Session 操作的處理類封裝成了一個(gè) Filter,通過這個(gè) Filter 對(duì) Session 進(jìn)行處理,下面請(qǐng)看相關(guān)代碼。

代碼如下

首先,增加一個(gè)新類,NewSessionFilter。

  1. <span style="font-family:Comic Sans MS;">package com.test.web.common;
  2. import java.io.IOException;
  3. import java.util.Enumeration;
  4. import java.util.HashMap;
  5. import java.util.Iterator;
  6. import java.util.Map;
  7. import java.util.Map.Entry;
  8. import javax.servlet.Filter;
  9. import javax.servlet.FilterChain;
  10. import javax.servlet.FilterConfig;
  11. import javax.servlet.ServletException;
  12. import javax.servlet.ServletRequest;
  13. import javax.servlet.ServletResponse;
  14. import javax.servlet.http.HttpServletRequest;
  15. import javax.servlet.http.HttpSession;
  16. import org.apache.shiro.SecurityUtils;
  17. import org.slf4j.Logger;
  18. import org.slf4j.LoggerFactory;
  19. public class NewSessionFilter implements Filter {
  20. private String url;
  21. private static final Logger logger = LoggerFactory.getLogger(NewSessionFilter.class);
  22. public static final String NEW_SESSION_INDICATOR = "com.cacss.sc.web.common.NewSessionFilter";
  23. public static void newSession(){
  24. HttpSession session = (HttpSession) SecurityUtils.getSubject().getSession(true);
  25. session.setAttribute(NEW_SESSION_INDICATOR, true);
  26. }
  27. @Override
  28. public void destroy() {
  29. System.out.println("NewSessionFilter destory");
  30. }
  31. @Override
  32. public void doFilter(ServletRequest request, ServletResponse response,
  33. FilterChain chain) throws IOException, ServletException {
  34. System.out.println("NewSessionFilter doFilter");
  35. if (request instanceof HttpServletRequest) {
  36. HttpServletRequest httpRequest = (HttpServletRequest) request;
  37. //取的url相對(duì)地址
  38. String url = httpRequest.getRequestURI();
  39. System.out.println(url);
  40. if (httpRequest.getSession() != null) {
  41. System.out.println("NewSessionFilter doFilter httpRequest.getSession().getId()"+ httpRequest.getSession().getId());
  42. //--------復(fù)制 session到臨時(shí)變量
  43. HttpSession session = httpRequest.getSession();
  44. HashMap old = new HashMap();
  45. Enumeration keys = (Enumeration) session.getAttributeNames();
  46. while (keys.hasMoreElements()){
  47. String key = (String) keys.nextElement();
  48. if (!NEW_SESSION_INDICATOR.equals(key)){
  49. old.put(key, session.getAttribute(key));
  50. session.removeAttribute(key);
  51. }
  52. }
  53. if (httpRequest.getMethod().equals("POST") && httpRequest.getSession() != null
  54. && !httpRequest.getSession().isNew() && httpRequest.getRequestURI().endsWith(url)){
  55. session.invalidate();
  56. session=httpRequest.getSession(true);
  57. logger.debug("new Session:" + session.getId());
  58. }
  59. //-----------------復(fù)制session
  60. for (Iterator it = old.entrySet().iterator(); it.hasNext();) {
  61. Map.Entry entry = (Entry) it.next();
  62. session.setAttribute((String) entry.getKey(), entry.getValue());
  63. }
  64. }
  65. }
  66. chain.doFilter(request, response);
  67. System.out.println("NewSessionFilter doFilter end");
  68. }
  69. @Override
  70. public void init(FilterConfig filterConfig) throws ServletException {
  71. System.out.println("NewSessionFilter init");
  72. System.out.println("NewSessionFilter init end");
  73. }
  74. }</span>

然后,在 web.xml 中配置 Filter。

  1. <span style="font-family:Comic Sans MS;"><filter>
  2. <filter-name>NewSessionFilter</filter-name>
  3. <filter-class>com.cacss.sc.web.common.NewSessionFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>NewSessionFilter</filter-name>
  7. <url-pattern>/login</url-pattern>
  8. </filter-mapping>
  9. </span>

這樣處理完之后,再啟動(dòng)應(yīng)用服務(wù)器,登錄前后的 JSessionId 就已經(jīng)不一樣了,也就是說,會(huì)話標(biāo)識(shí)未更新的問題也就解決了。


結(jié)束語


這個(gè)問題困擾了我 n 多天,直到看到這個(gè)解決思路之后,通過跟測(cè)試部的童鞋協(xié)商,測(cè)試通過之后,才算是真正的解決了。這也算是這個(gè)系列的最后一篇了,寫到現(xiàn)在已經(jīng)把大部分的 Web 安全方面的漏洞都提到過了,而且也都給出了一些解決方案。

通過這近一個(gè)多月的漏洞修復(fù),我在 Web 安全方面真的是惡補(bǔ)了一番,也接觸了很多安全方面的技術(shù),這對(duì)于我以后的開發(fā)、設(shè)計(jì)都是很有好處的,在開發(fā)、設(shè)計(jì)的時(shí)候,就會(huì)考慮到會(huì)不會(huì)產(chǎn)生安全漏洞,怎樣做會(huì)避免這樣的問題。這樣,就不會(huì)在測(cè)試的時(shí)候出現(xiàn)很多不必要的漏洞了。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多