2009-03-27 5 views
1

Das könnte eine sehr seltsame Frage sein, aber einige Hinweise oder Richtlinien werden sehr hilfreich sein. Wir möchten unsere Website "sessionsbeweisend" machen, grundsätzlich sicherstellen, dass zwei verschiedene Sessions die gleiche Linkstruktur generieren (z. B. Sowohl user-a als auch user-b erhalten dieselben Links auf derselben Webseite).Haben Sie Vorschläge, wie Sie eine Website als Session-Proof ablegen können?

Der Grund für diesen Test ist, dass unsere Website von einer Content-Management-Lösung generiert wird, die für jede Sitzung verschiedene Links (URLs) generiert. Dieser CMS (der intern erstellt wurde) wurde behoben, um die gleichen Links zwischen den Sitzungen zurückzugeben. Der andere situation mit Session-Proofing, ist, dass unser Caching-Mechanismus (SQUID) TCP_MISSes ständig auf unserer Website gibt, was uns denken lässt, dass die komplette Site als dynamisch gekennzeichnet ist und der Caching-Server alle Objekte neu generieren muss die ganze Zeit.

Antwort

0

Möchten Sie überprüfen, dass zwei verschiedene Benutzer tatsächlich die gleiche Struktur sehen? Eine Möglichkeit wäre, mit etwas wie wget die gesamte Website von zwei verschiedenen IP-Adressen zu crawlen und dann die resultierenden Bäume zu vergleichen.

+0

Danke für Ihre Antwort Markus Ich habe "wget ​​-r url" verwendet und ich sehe, dass ich Unterschiede bei versteckten Tags und anderen dynamischen Inhalten habe. Was ich nicht sehe, ist, wie man sagt, ob beide Sitzungen gleich sind. – Geo

+0

Die Frage ist "Was _exactly_ meinst du mit 'beide Sitzungen sind gleich'"; Wenn Sie _eine_ nicht konstante Information in der Sitzung speichern, sind sie nur durch Zufall identisch. Aus Ihrer Frage klingt jedoch, dass alles, was Sie interessieren, die Linkstruktur ist, die Ihnen wget geben sollte. – MarkusQ

0

Dies ist, was wir bei amplafi.com

tun (h/t http://randomcoder.com/articles/jsessionid-considered-harmful) Siehe in der 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> 

Und das Java-Code:

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

Wenn jeder Seite in Ihrer Website hat einen anderen Link, dann Caching würde definitiv für die Website gebrochen werden.

Fragen Sie, wie Sie überprüfen, ob die Links pro Sitzung gleich sind? Oder fragen Sie, wie Sie sicherstellen können, dass die Verbindungen pro Sitzung gleich sind?

Für die ehemalige einfach von zwei verschiedenen Browsern und Benutzeranmeldungen durchsuchen sollte ausreichen.

Wie für die Gewährleistung der Links sind die gleichen pro Sitzung gut ... Das hängt von Ihrer Implementierung, die Sie angegeben, war inhouse.

0

Sie könnten einen Test in Java mit Selen schreiben. Fügen Sie die Assertionen für die erwarteten Daten hinzu. Dann könnten Sie eine Liste von mehreren Logins durchlaufen, um die Testdurchläufe für jeden zu sehen.

Selen ist ziemlich einfach zu beginnen und Tests können in vielen Sprachen geschrieben werden.

Siehe hier für weitere Details:

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

Ein Beispiel Test etwas so sein würde (Pseudo-Code):

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

Selen viele Methoden gibt, wenn Links zu überprüfen und andere Seitenelemente vorhanden sind und der Test sogar im Browser aufgezeichnet werden kann - probieren Sie es aus!

0

Warum unterscheiden sich Ihre URLs? Speichern Sie Sitzungs-IDs in ihnen?

Wenn Sie sind, sollten Sie das wahrscheinlich zu einem Cookie verschieben!

+0

Genau die Frage, die ich stelle. – PaulBM

0

Sie könnten versuchen, eine Load-Test-Suite wie Pureload zu verwenden, um mehrere Benutzer zu simulieren, die Ihre Site aufrufen. Pureload kann mehrere gleichzeitige simulierte Benutzer haben, die jeweils die gleiche Anfrage stellen und bestätigen, dass die Ergebnisse wie erwartet sind. Abhängig davon, wie dynamisch Ihre Ergebnisse sind, kann dies Ihnen helfen, Ihren Fehler zu testen.