1

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

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

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

4

6 回答 6

0

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

于 2009-03-27T14:33:04.363 回答
0

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

于 2009-06-21T08:18:38.220 回答
0

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

(h/t 请参阅web.xml 中的http://randomcoder.com/articles/jsessionid-considered-harmful ):

<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;
        }
    }
}
于 2009-03-27T21:19:15.197 回答
0

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

如果你是,你应该把它移到饼干上!

于 2009-06-13T08:30:11.700 回答
0

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

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

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

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

于 2009-04-01T02:59:39.637 回答
0

您可以使用 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 提供了许多方法来检查链接和其他页面元素是否存在,甚至可以将测试记录在浏览器中 - 试一试!

于 2009-06-09T14:56:36.937 回答