【发布时间】:2017-03-21 02:58:25
【问题描述】:
任何人都可以在这方面帮助我。 我被指派保护现有的 Web 应用程序。
问题: 当用户已经登录到应用程序时(这意味着会话处于活动状态),那时攻击者可以猜测输入字段并保存 url 并创建类似的页面并发送超链接。如果用户点击该链接,它不会通过 javascript,而是会点击 spring 控制器。由于会话处于活动状态,它将攻击者数据保存到数据库中。
这是我们现在使用的。 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() 方法中创建一个随机令牌并将其存储在会话中。
- 从session中获取变量,并在jsp中放入隐藏变量
- 当用户执行任何操作时,将隐藏变量与值一起传递给控制器作为请求参数。
- 在控制器/过滤器中从会话中获取随机值并从请求参数中获取隐藏值。现在比较一下。如果匹配,则进行正常操作,否则抛出错误页面。
现在我担心的是,如果我实现上述解决方案,我必须在每个jsp中编写隐藏变量代码,并在每个请求和请求参数中传递给控制器。
你能帮我解决一下吗?提前致谢
【问题讨论】:
-
您是否尝试使用站点管理器?并实施单点登录?您不需要显式处理会话变量。
-
@JerinJoseph:刚刚更新了这个问题以及我正在考虑如何解决这个问题。请您再看一遍。
标签: spring-mvc spring-security csrf restful-authentication csrf-protection