乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       三十的狼 2019-09-06


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


      問(wèn)題


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


      曲折過(guò)程


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

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

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


      最終方案


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

      代碼如下

      首先,增加一個(gè)新類(lèi),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)不一樣了,也就是說(shuō),會(huì)話(huà)標(biāo)識(shí)未更新的問(wèn)題也就解決了。


      結(jié)束語(yǔ)


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

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

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(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)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多