2014-05-07 15 views
6

Ich versuche, meine Webanwendung vor CSRF-Angriffen zu schützen, indem ich den Struts-Token-Interceptor verwende.Struts2-Token-Interceptor: CSRF-Schutz

Das Problem, mit dem ich gerade konfrontiert bin, ist unsere JSP-Seiten macht mehr als einen Aufruf an Server (Während JSP in JS umgewandelt wird, wird ein Struts-Token zu JS hinzugefügt. Aber in diesem JS gibt es mehrere Ajax-Anfragen. Ich hoffe ich mache ich mich klar.), wegen Token Interceptor wird nur die erste Anfrage an den Server validiert. Andere Anforderungen werden ungültig, weil das Struts-Token nach jeder Überprüfung zurückgesetzt wird.

Gibt es eine Möglichkeit, dass ich Struts das Token jedes Mal zurücksetzen, wenn es validiert? IS gibt es irgendwelche anderen Lösungen, um dies in Struts Interceptor zu behandeln.

Ich sehe auch tomcatcsrfprotection Modul, ich denke, ich werde mit dem gleichen Problem hier auch enden.

managepage.jsp:

<s:token /> 
<script type="text/javascript"> 
var strutsToken = "<s:property value="#session['struts.tokens.token']" />"; 
var requestParams = {mainAction: 'loadGroups','struts.token.name': 'token' , token:strutsToken}; 

Ext.Ajax.request({ 
       url: 'manageUserAccount.action', 
       params: Ext.urlEncode(requestParams), 
       disableCaching: true, 
       success: this.actionCallback 
       }); 



//loading widgets 

var requestParams = {mainAction: 'loadusers','struts.token.name': 'token' , token:strutsToken}; 

Ext.Ajax.request({ 
       url: 'manageUserAccount.action', 
       params: Ext.urlEncode(requestParams), 
       disableCaching: true, 
       success: this.actionCallback 
       }); 

</script> 

Struts.xml:

<action name="manageUserAccountEdit" class="ManageUserAccountEditAction"> 
    <interceptor-ref name="csrf-protection" /> 
    <result name="success">/pages/manageUserAccount.jsp</result> 
</action> 

Ich habe nur minimalen Code hinzugefügt, so dass das Verständnis wird es leichter sein.

+0

Was meinst du * Jsp Seiten macht mehr als einen Aufruf an Server *? –

+0

Ich muss mehrere AJAX-Anfrage mit dem gleichen Token auf der Client-Seite machen. – Mok

+0

Während jsp in js konvertiert wird, wird ein struts-Token zu js hinzugefügt. In diesem js gibt es mehrere Ajax-Anfrage. Ich hoffe, ich mache mich klar. – Mok

Antwort

2

Sie können den Code in meiner Antwort für Unable to implement Struts 2 token interceptor with hyperlink verwenden, um eine Aktion zu erstellen, die ein Token zurückgibt. Sie können eines der Ergebnisse stream oder json oder dispatcher verwenden, um ein Token als AJAX-Erfolgsrückrufergebnis zurückzugeben. Sie finden ein Beispiel in jQuery Ajax - issue returning JSON value. Jetzt können Sie das Token verwenden, um Ihre Ajax-Anfragen zu stellen. Jedes Mal, wenn Sie eine neue Anfrage machen müssen, sollten Sie eine Token-Aktion aufrufen, um ein neues Token zu erhalten. Verwenden Sie das Token als Parameter für Ihre Anfrage und setzen Sie den Token Interceptor vor Ihre Aktionen.