一尘不染

如何禁用对JSP页面的GET请求?

jsp

我正在修复一些旧缺陷,并且作为一个缺陷的一部分,我需要确保某些请求仅是POST到JSP页面,而不是GET请求。该应用程序具有将数据提交到另一个JSP页面的表单(我知道它是错误的,并且针对MVC,但为时已晚),因为它是一个JSP页面,因此我们可以发布请求,也可以获取请求。如果是恶意用户,则可以从浏览器http://host:80/somejsp.jsp?param=value&param=value等中读取表单并以GET形式发送请求。在这种情况下,它将成为违规。我需要确保未处理此类GET请求。一种方法是在jsp页面中执行以下步骤-

if (request.getMethod().equals("GET")) {
   // reroute the user as it is not a valid req
}

还有其他方法吗?


阅读 259

收藏
2020-06-08

共1个答案

一尘不染

两种解决方案:

  1. 添加<security-constraint>一个空<auth-constraint><url-pattern>*.jsp<http-method>GET,这将阻止GET在JSP文件给大家(由麦克道尔建议)要求:
        <security-constraint>
        <display-name>Restrict GET requests on JSP files</display-name>
        <web-resource-collection>
            <web-resource-name>JSP files</web-resource-name>
            <url-pattern>*.jsp</url-pattern>
            <http-method>GET</http-method>
        </web-resource-collection>
        <auth-constraint />
    </security-constraint> 
  1. 创建一个Filter侦听<url-pattern>*.jsp,并基本上在doFilter()方法中执行以下操作。
        if (((HttpServletRequest) request).getMethod().equals("GET")) {
        ((HttpServletResponse) response).sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
    } else {
        chain.doFilter(request, response);
    }

无需在所有JSP页面上粘贴相同的内容,因为这样只会导致IllegalStateException: response already committed错误。

2020-06-08