【问题标题】:Any suggestions on how to session proof a website?关于如何对网站进行会话证明的任何建议?
【发布时间】:2010-10-15 22:55:52
【问题描述】:

这可能是一个非常奇怪的问题,但一些提示或指南会很有帮助。我们想要对我们的网站进行“会话证明”,基本上确保两个不同的会话生成相同的链接结构(例如,用户 a 和用户 b 将在同一个网页中获得相同的链接)。

此测试背后的原因是,我们的网站是由内容管理解决方案生成的,该解决方案将为每个不同的会话生成不同的链接 (URL)。该 CMS(内部构建)已修复为跨会话返回相同的链接。

另一个带有会话验证的situation,是我们的缓存机制 (SQUID) 一直在向我们的网站提供 TCP_MISSes,这使我们认为整个网站都被标记为动态的并且缓存服务器必须重新获取所有一直都是对象。

【问题讨论】:

    标签: java session tomcat session-state


    【解决方案1】:

    您可以使用 selenium 在 Java 中编写测试。为您期望的数据添加断言。然后,您可以遍历多个登录列表以查看每个登录的测试通过。

    Selenium 很容易上手,并且可以用多种语言编写测试。

    详情请看这里:

    http://seleniumhq.org/projects/remote-control/

    一个示例测试是这样的(伪代码):

    public void setUp() throws Exception {
        setUp("http://mywebsite.com", "*chrome"); // to run the test in opera replace chrome with opera
    }
    
    public void testLoginWithMultipleUsers() {
        for(loop over users) {
            runLogin(user)
        }
    }
    
    public void runLogin(User user) throws Exception {
        selenium.open("/login.htm");
        assertTrue(selenium.isTextPresent("Link1"));
        assertTrue(selenium.isTextPresent("2003-2008"));
        selenium.open("/account");
        assertTrue(selenium.isTextPresent("2003-2008"));
        selenium.waitForPageToLoad("30000");
        etc...
    

    Selenium 提供了很多方法来检查链接和其他页面元素是否存在,甚至可以将测试记录在浏览器中 - 试试看吧!

    【讨论】:

      【解决方案2】:

      您可以尝试使用像 Pureload 这样的负载测试套件来模拟多个用户访问您的网站。 Pureload 可以有多个并发的模拟用户,每个用户都发出相同的请求,并确认结果符合预期。根据您的结果的动态程度,这可能会帮助您测试您的错误。

      【讨论】:

        【解决方案3】:

        为什么您的网址不同?您是否在其中存储会话 ID?

        如果你是,你应该把它移到一个 cookie 中!

        【讨论】:

        • 正是我要问的问题。
        【解决方案4】:

        如果您网站中的每个页面都有不同的链接,那么该网站的缓存肯定会被破坏。

        您是否在询问如何验证每个会话的链接是否相同? 或者您是在问如何确保每个会话的链接相同?

        对于前者,只需从两个不同的浏览器和用户登录浏览就足够了。

        至于确保每个会话的链接都相同...这将取决于您指定的内部实施。

        【讨论】:

          【解决方案5】:

          这就是我们在amplafi.com 所做的事情

          (h/t 见http://randomcoder.com/articles/jsessionid-considered-harmful) 在 web.xml 中:

          <filter>
              <filter-name>DisableSessionIdsInUrlFilter</filter-name>
              <filter-class>
                  com.amplafi.web.servlet.DisableSessionIdsInUrlFilter
              </filter-class>
          </filter>
          
          
          <filter-mapping>
              <filter-name>DisableSessionIdsInUrlFilter</filter-name>
              <url-pattern>/*</url-pattern>
          </filter-mapping>
          

          还有这个java代码:

          import java.io.IOException;
          
          import javax.servlet.Filter;
          import javax.servlet.FilterChain;
          import javax.servlet.FilterConfig;
          import javax.servlet.ServletException;
          import javax.servlet.ServletRequest;
          import javax.servlet.ServletResponse;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import javax.servlet.http.HttpServletResponseWrapper;
          import javax.servlet.http.HttpSession;
          
          /**
           * remove any session id from the Url.
           *
           *
           * Ideally we would like to only remove this container-provided functionality
           * only for public portions of the web site (that can be crawled by google)
           * or for links that are to be bookmarked.
           *
           * @author Patrick Moore
           */
          public class DisableSessionIdsInUrlFilter implements Filter {
              @Override
              public void destroy() {
              }
          
              @Override
              public void doFilter(ServletRequest request, ServletResponse response,
                      FilterChain chain) throws IOException, ServletException {
                  if (!(request instanceof HttpServletRequest)) {
                      chain.doFilter(request, response);
                      return;
                  }
          
                  HttpServletRequest httpRequest = (HttpServletRequest) request;
                  HttpServletResponse httpResponse = (HttpServletResponse) response;
                  /*
                   * Next, let's invalidate any sessions that are backed by a URL-encoded
                   * session id. This prevents an attacker from generating a valid link.
                   * Just because we won't be generating session-encoded links doesn't
                   * mean someone else won't try
                   */
                  if (httpRequest.isRequestedSessionIdFromURL()) {
                      HttpSession session = httpRequest.getSession();
                      if (session != null) {
                          session.invalidate();
                      }
                  }
                  HttpServletResponseWrapper wrappedResponse = new ResponseWrapper(httpResponse);
                  chain.doFilter(request, wrappedResponse);
              }
          
              @Override
              @SuppressWarnings("unused")
              public void init(FilterConfig arg0) throws ServletException {
              }
          
              /**
               * wraps response and prevense jsessionid from being encoded on the output.
               */
              private static class ResponseWrapper extends HttpServletResponseWrapper {
          
                  ResponseWrapper(HttpServletResponse httpResponse) {
                      super(httpResponse);
                  }
                  @Override
                  public String encodeRedirectUrl(String uri) {
                      return uri;
                  }
          
                  @Override
                  public String encodeRedirectURL(String uri) {
                      return uri;
                  }
          
                  @Override
                  public String encodeUrl(String uri) {
                      return uri;
                  }
          
                  @Override
                  public String encodeURL(String uri) {
                      return uri;
                  }
              }
          }
          

          【讨论】:

            【解决方案6】:

            您是否要验证两个不同的用户是否确实看到了相同的结构?一种方法是使用 wget 之类的工具从两个不同的 IP 地址抓取整个网站,然后比较生成的树。

            【讨论】:

            • 感谢您的回复 Markus 我使用了“wget -r url”,我发现我在隐藏标签和其他动态内容方面存在差异。我没有看到的是如何判断两个会话是否相同。
            • 问题是“'两个会话都相同'究竟是什么意思”;如果您在会话中存储 any 非常量信息,它们将不会是相同的,除非是偶然的。不过,从您的问题来看,您所关心的只是链接结构,wget 应该给您。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-12-19
            • 2012-04-22
            • 2010-09-19
            • 2014-09-07
            相关资源
            最近更新 更多