CSRF-token generation-Problem
Verhindert CSRF unten waren die Schritte, die ich verfolgt habe:
1. Zum ersten mal, wenn die Anfrage kommt(zu loginfilter) session null ist, wird eine neue session hinzufügen token(randome-Nummer) zu dieser neuen Sitzung mit setAttribute() und redirect zum login.jsp-Bildschirm mit dispatcher.vorwärts.
2. in der login.jsp-Bildschirm verwenden getAttribute () - speichern des Tokens im verborgenen eingereicht.
3. auf "Absenden" der Anmeldung.jsp ersten Anfrage kommen wird, um loginfilter, hier vergleichen Sie die token aus der Anfrage mit dem token in der session, wenn Spiele dann gehen Sie mit der Ausführung der action-Klasse. andernfalls generiert der neue token ist für die gleiche session und eine Umleitung zum login.jsp mit sendRedirect()
bei mir lief der Sicherheits-tool für diese Anwendung, ich die Meldung "Missing one time token-parameter".
Bitte helfen Sie mir.
1.filter.java
if (session == null) {
chain.doFilter(request, response);
return;
}
else {
//validate the CSRF
String sToken = httprequest.getSession().getAttribute("CSRF_TOKEN")
.toString();
String pToken = httprequest.getParameter("CSRF_TOKEN");
System.out.println("Tokens - " + sToken + pToken);
if (sToken.equals(pToken)) {
chain.doFilter(request, response);
}
else {
CommonUtils.updateSessionToken(session);
/*
* RequestDispatcher rd =
* request.getRequestDispatcher("/login.jsp");
* rd.forward(request, response);
*/
httpresponse.sendRedirect("/login.jsp");
}
}
2.login.jsp
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
Object token = request.getSession().getAttribute("CSRF_TOKEN");
String tokenStr = "";
if (token != null) {
tokenStr = (String) token;
}
System.out.println("+tokenStr " + tokenStr);
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>CSRFGuard Test Application</title>
</head>
<body>
Welcome to the OWASP CSRFGuard Test Application! Where would you like
to go?
<br />
<form action="/CSRF/helloServlet" method="post">
<input type="text" name="username" /> <br /> <input type="text"
value="<%=tokenStr%>" name="CSRF_TOKEN" /> <input type="submit"
value="login">
</form>
</body>
</html>
3.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>CSRF</display-name>
<servlet>
<description>
</description>
<display-name>Hell0oServelt</display-name>
<servlet-name>HelloServelt</servlet-name>
<servlet-class>com.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServelt</servlet-name>
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>com.CsrfGuardHttpSessionListener</listener-class>
</listener>
<filter>
<filter-name>LoggedInFilter</filter-name>
<filter-class>com.LoggedInFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoggedInFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
4.CsrfGuardHttpSessionListener
public class CsrfGuardHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {
HttpSession session = event.getSession();
System.out.println("New session id - "+session.getId());
String tokenId = generateRandomId();
session.setAttribute("CSRF_TOKEN", tokenId);
System.out.println("newtoken -"+tokenId);
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
/** nothing to do **/
}
}
5.HelloServlet
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public HelloServlet() {
super();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Welcome ...!");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auf die Umleitung der browser ist einfach angewiesen, um eine neue Anfrage zu login.jsp. Diese login-Seite nicht über die token set in hidden-Feld, es sei denn, Sie sind mit einigen Rahmenbedingungen, die helfen können, dass Sie mit. So verwenden stattdessen request dispatcher weiterleiten. Auch Sie erwähnt, dass Sie lief ein Sicherheits-tool. Wenn es ein Werkzeug ist, das imitiert Anfragen, dann stellen Sie sicher, dass der token in der replay zweiten Anfrage oder es wird nicht erkannt.
BEARBEITEN (Nach code gepostet wurde):
Dass ich nicht die Argumentation eines listener. Was Sie erreichen wollte, ist, dass, wenn eine Sitzung erstellt, die Sie automatisch zuordnen eines Tokens mit ihm. Dies können Sie tun, in Ihrem filter der Klasse als gut. Bitte beachten Sie, dass die httpRequest.getSession Prüfungen für die Sitzung und, falls nicht vorhanden erstellt es auch. Es gibt weitere Varianten dieser Methode, die boolean-parameter. Auch Sie müssen verstehen, dass, wenn Sie tun Kette.doFilter(request, response) bedeutet, dass der request-Verarbeitung für das weitere Vorgehen in der Kette.
Können Sie Hilfe von anderen beliebten CSRF-filter-Implementierungen wie hier , hier. Sie können auch nehmen einen Blick auf Probe gebucht hier