2014-05-07 31 views
6

Próbuję chronić moją aplikację internetową przed atakami CSRF przy użyciu przechwytującego tokena rozporek.Przechwytywacz tokenów Struts2: ochrona CSRF

Problem, z którym teraz borykam, polega na tym, że nasze strony JSP nawiązują więcej niż jedno połączenie z serwerem (podczas gdy JSP jest konwertowane na JS, to Jock dodaje znak toka. Ale w tym JS istnieje wiele żądań Ajax. wyjaśniam się.), z powodu przechwytywania tokena pierwsze żądanie do serwera jest sprawdzane. Inne żądania są unieważniane, ponieważ token zastępczy jest resetowany po każdej walidacji.

Czy istnieje sposób zatrzymać Struts z resetowania token za każdym razem to sprawdza? Czy są jakieś inne rozwiązania, aby poradzić sobie z tym w kolumnie przechwytującej?

Ja również patrząc na module tomcatcsrfprotection Chyba będę skończyć z tym samym problemem tutaj również.

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> 

Właśnie dodany minimalny kod tak, że zrozumienie będzie łatwiejsze.

+0

Co to znaczy, że strony * jsp wykonują więcej niż jedno połączenie z serwerem *? –

+0

Potrzebuję wykonać wiele żądań ajax przy użyciu tego samego tokena na stronie klienta. – Mok

+0

Podczas gdy jsp jest konwertowane na js, to token rozpórki jest dodawany do js. W tym js istnieje wiele żądań Ajax. Mam nadzieję, że wyrażam się jasno. – Mok

Odpowiedz

2

Można użyć kodu w mojej odpowiedzi na Unable to implement Struts 2 token interceptor with hyperlink stworzyć akcję, która zwraca token. Możesz użyć dowolnego z wyników: stream lub json lub dispatcher, aby zwrócić token jako wynik zwrotnego sukcesu Ajax. Możesz znaleźć przykład w jQuery Ajax - issue returning JSON value. Teraz możesz użyć tokena do złożenia żądań Ajax. Za każdym razem, gdy potrzebujesz nowego żądania, powinieneś zadzwonić do akcji tokena, aby otrzymać nowy token. Użyj tokena jako parametru do żądania i umieść przechwytujący tokeny przed swoimi działaniami.