0

任何人都可以请帮助我。 我已被分配来保护现有的Web应用程序。基于Spring MVC安全令牌的身份验证

问题: 当用户已经登录到应用程序(这意味着会话是活动的),那时攻击者可以猜测输入字段并保存url并创建一个类似的页面并发送超级链接。如果用户点击该链接,它将不会通过JavaScript,而是会触发弹簧控制器。由于会话处于活动状态,因此会将攻击者数据保存到数据库中。

这是我们现在使用的。 1)春季安全

<http auto-config="true"> 
    <intercept-url pattern="/**" access="ROLE_ADMIN, ROLE_HR" /> 
    <custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" /> 
</http> 

<beans:bean id="siteminderFilter" class="com.mywbsite.security.UserFilter"> 
    <beans:property name="authenticationManager" ref="authenticationManager" /> 
    <beans:property name="continueFilterChainOnUnsuccessfulAuthentication" value="false"/> 
</beans:bean> 

该方法被调用时,用户登录到应用程序第一次

protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) { 

    String userId = request.getHeader("uid"); 
    logger.info("<<<<<<<<<<<<<<<<<<<<<userId>>>>>>>>>>>>>>>>>>>>>>> : "+userId); 

    return userId; 
} 

当用户做任何事情它调用任何控制器/ JAVA

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
     throws IOException, ServletException { 

    System.out.println(request.getParameter(BaseConstants.DV_USER_SESSION_IDENTIFIER)); 
    logger.info(request.getParameter(BaseConstants.DV_USER_SESSION_IDENTIFIER)); 
    logger.info("Existing the UserFilter.doFilter method..."); 
} 
这种方法被称为

解决方案: 在控制器/过滤器中,我必须确定请求是来自我的应用程序还是来自其他任何地方。

这就是我想要实现的。

  • 在getPreAuthenticatedPrincipal()方法内部创建一个随机令牌并将其存储在会话中。
  • 从会话中获取变量并将其放入jsp中的隐藏变量中
  • 当用户执行任何操作时,将值传递给隐藏变量并作为请求参数传递给控制器​​。
  • 在Controller/Filter中从会话中获取随机值并从请求参数中获取隐藏值。现在比较。如果匹配,则执行正常操作,否则抛出错误页面。

现在我关心的是,如果我实现上述解决方案,我必须在每个jsp中写入隐藏的变量代码,并在每个请求和请求参数中传递给控制器​​。

你能帮我解释一下吗?在此先感谢

+0

你想使用siteminder?并实施单一登录?您不需要显式处理会话变量。 –

+0

@JerinJoseph:刚才更新了这个问题,以及我想如何解决这个问题。你能再看一遍吗? – SKumar

回答

0

我解决了上述问题,使用Spring CSRF。我在实施CSRF时遇到了一个问题。问题是CSRF正在创建2个令牌。花费很长时间(至少1天)才能找到根本原因。根情况是我试图在我的Fiter中获取csrf标记值并使用下面的代码打印它。所以一旦我写了request.getAttribute(“_ csrf”),它会创建一个新的标记。所以我刚刚从我的csrf中删除了下面的代码,只是做了上面的spring csrf链接中描述的内容。它的工作

//  CsrfToken token = (CsrfToken) request.getAttribute("_csrf"); 
//  System.out.println(">>>>>>>>>>UserFilter.getPreAuthenticatedPrincipal() CSRF Token: " + token.getToken());