2009-03-27 7 views
1

これは非常に奇妙な質問かもしれませんが、いくつかのヒントやガイドラインは非常に役に立ちます。私たちはウェブサイトを「セッションプルーフ」したいが、基本的に2つの異なるセッションが同じリンク構造を生成するようにする(例えば、ユーザ-aとユーザ-bの両方が同じウェブページ内で同じリンクを得る)。ウェブサイトをセッション証明する方法に関する提案はありますか?

このテストの背後にある理由は、私たちのWebサイトが、異なるセッションごとに異なるリンク(URL)を生成するコンテンツ管理ソリューションによって生成されることです。そのCMS(内部で構築されている)は、セッション間で同じリンクを返すように修正されました。

セッションプルーフィングを使用している他のsituationは、私たちのキャッシュ機構(SQUID)がTCP_MISSesを私たちのウェブサイトに常時提供しているため、完全なサイトが動的であると判断し、キャッシュサーバはすべてのオブジェクトすべての時間。

答えて

0

2人の異なるユーザーが同じ構造を実際に見ていることを確認しようとしていますか? 1つの方法は、wgetのようなものを使って2つの異なるIPアドレスからWebサイト全体をクロールし、結果のツリーを比較することです。

+0

あなたのお返事ありがとうMarkus私は "wget -r url"を使用しており、隠れたタグやその他の動的コンテンツに違いがあることがわかります。私が見ていないのは、両方のセッションが同じかどうかを判断する方法です。 – Geo

+0

質問は、「両方のセッションが同じであるかどうかは正確に何か」という質問です。定数ではない情報をセッションに格納すると、事故以外は同一ではありません。あなたの質問から、あなたが心配するのはwgetがあなたに与えるべきリンク構造です。 – MarkusQ

0

これは、(H/Tはhttp://randomcoder.com/articles/jsessionid-considered-harmfulを参照してください)私たちはamplafi.com

で何をすべきか、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; 
     } 
    } 
} 
0

すべての場合あなたのサイトのページに別のリンクがあると、そのサイトのキャッシュが間違いなく壊れてしまいます。

セッションごとにリンクが同じであることを確認する方法は? または、セッションごとにリンクが同じであることを確認する方法は?

前者の場合、2つの異なるブラウザからのブラウジングとユーザーログインで十分です。

リンクがセッションごとに同じであることを保証するために...これは、あなたが指定したインプリメンテーションに依存します。

0

セレンを使ってJavaでテストを書くことができます。期待するデータのアサーションを追加します。次に、複数のログインのリストをループして、それぞれのテストパスを確認することができます。

セレンはかなり使い始めて、テストは多言語で書くことができます。

詳細はこちらをご覧ください:

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... 

セレンはリンクや他のページ要素かどうかを確認するためのメソッドの多くを提供しますテストがブラウザに記録されることもあります - 試してみてください!

0

なぜあなたのURLが異なっていますか?セッションIDを保存していますか?

あなたがいる場合は、おそらくそれをクッキーに移動する必要があります!

+0

まさに私が求めている質問です。 – PaulBM

0

Pureloadのような負荷テストスイートを使用して、複数のユーザーがサイトにアクセスするのをシミュレートすることができます。 Pureloadには、複数の同時シミュレートユーザーがそれぞれ同じ要求を行い、結果が期待どおりであることを確認できます。結果がどのように動的であるかによって、これはあなたのバグをテストするのに役立ちます。

関連する問題