【发布时间】:2020-08-25 09:41:13
【问题描述】:
我在我的 Spring Boot 应用程序中创建了一个 SQL 注入过滤器,它拦截每个请求并验证可能的 SQL 注入的输入。如果输入无效,那么我想将用户重定向回登录页面。使用我的代码,我可以看到正在通过 DevTools 进行内部调用,但浏览器没有重定向到指定页面。
过滤器
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String url = req.getRequestURL().toString();
Enumeration<String> enumeration = request.getParameterNames();
while (enumeration.hasMoreElements()) {
String paramName = enumeration.nextElement();
String value = request.getParameter(paramName);
String sqlRegex =
"\\b(ALTER\\s+TABLE{0,1}|CREATE\\s+TABLE{0,1}|DELETE\\s+FROM{0,1}|DROP\\s+TABLE{0,1}|EXEC(UTE){0,1}|INSERT\\s+INTO{0,1}|MERGE\\s+INTO{0,1}|SELECT\\s[0-9a-zA-Z_*]*\\s+FROM{0,1}|UPDATE\\s[0-9a-zA-Z_]*\\s+SET{0,1}|UNION\\n+ALL{0,1})\\b";
int bufferOverflowLength = 4000;
if (value != null && (Pattern.compile(sqlRegex).matcher(value.toUpperCase()).find()) || value.length() >= bufferOverflowLength) {
HttpServletResponse resp = (HttpServletResponse) response;
String redirectUrl = req.getContextPath() + "/logout";
resp.setStatus(403);
resp.sendRedirect(redirectUrl);
return;
}
}
}
如何强制浏览器重定向到注销页面?
更新: 根据@buettner123 的评论,我已经在 Angular 中实现了一个 httpInterceptor,但这仍然无法拦截我来自 Filter 的请求。
Angular 拦截器代码
$httpProvider.interceptors.push(['$location', '$injector', '$q', function ($location, $injector, $q) {
return {
'request': function (config) {
console.log("Request intercepted");
return config;
},
'responseError': function (rejection) {
console.log("Response Error Intercepted");
return $q.reject(rejection);
},
'response': function(response) {
// do something on success
console.log('I am done');
var status = response.status;
console.log(status);
return response;
}
};
}]);
【问题讨论】:
-
AngularJs 是一个单页应用程序。按照您使用过滤器的方法,我将使用相应的 http 代码(例如 400)回答请求,并在 AngularJs 部分使用错误拦截器进行重定向,使用 AngularJs 路由
-
我在 AngularJS 中添加了一个 httpInterceptor,它可以很好地处理其他请求,但无法拦截从我的过滤器发起的请求。
-
请尝试使用
resp.sendError(HttpServletResponse.SC_FORBIDDEN);而不是sendRedirect -
成功了。非常感谢您的帮助。
标签: java angularjs spring-boot servlet-filters