【问题标题】:Reject GET Method on j_security_check拒绝 j_security_check 上的 GET 方法
【发布时间】:2010-07-22 18:29:26
【问题描述】:

有没有办法只允许对 j_security_check 的 POST 请求?我想拒绝 GET。 我正在使用基于表单的安全性,并且只想允许帖子到 j_security_check。如果通过 GET 发出登录请求,则应拒绝该请求。

【问题讨论】:

    标签: java security jakarta-ee weblogic websphere


    【解决方案1】:

    由于使用 GET 方法的 JAAS 的安全问题,我一直尝试在 JBOSS(Tomcat) 服务器上做同样的事情,我尝试了各种方法。

    1. 在 url 模式 /j_security_check 上使用 web.xml 安全约束以仅使用 POST - 这对 JAAS 机制不起作用,因为它对普通 servlet 起作用。

    2. 将登录详细信息从登录页面传递给一个中间 servlet,该 servlet 检查请求方法,如果不是 GET,则转发到 j_security_check。 - 这不起作用,而且过于复杂。

    3. 创建一个过滤器来检查请求方法,并且只在 POST 消息上调用 j_security_check - 这不起作用,因为 JAAS 在 Web 容器中更深,并且在过滤器机制之前被调用。

    4. 创建一个 Valve,它在 JAAS 之前被调用。

    通过在invoke方法中添加以下内容:

    HttpServletRequest req = (HttpServletRequest) request;
    if (req.getMethod().equals("GET")) {
     log.warn("Someone is trying to use a GET method to login!!");                       
     request.getRequestDispatcher("/login.jsp").forward(req, response);
     throw new ServletException("Using a GET method on security check!");
    }
    

    这确实有效。

    【讨论】:

      【解决方案2】:

      是的,您可以拒绝 GET 请求。在安全约束部分的 web.xml 文件中,您可以指定允许的 http 方法。在以下 xml 中,此安全约束允许的唯一方法是 POST 方法。 j_security check 将只允许 post 方法。

      <security-constraint>
        <display-name>Your security constraint</display-name>
        <web-resource-collection>
           <web-resource-name>Your resource name</web-resource-name>
           <url-pattern>/The URL pattern</url-pattern>
           <http-method>POST</http-method>
        <web-resource-collection>
      <security-constraint>
      

      【讨论】:

      • 但这不会限制整个 只接受 POST 请求吗?这里需要的是仅将 /j_security_id 限制为 POST。还是您的意思是 j_security_id 应该有自己的
      • 在上面你可以用 /j_security_check 替换 url-pattern
      • 真的有可能使用过滤器捕获对 j_security_check 的请求吗?我知道 JAAS 会吃掉这些请求并直接以 302 响应原始请求的 URL,而不会将请求传递给 Filter。
      • 我们一直在过滤器中使用 j_security_check url。我们在 Websphere Server 中运行它们。每次有人登录时都会运行过滤器。我们还使用仅在 j_security_check 上运行的过滤器来限制用户可以拥有的会话数。
      • 奇怪。我刚刚在 Payara 上创建了一个小型过滤器,映射到 /* 以记录所有请求,并且日志包含对 j_security_id 的 no 请求。也许 Websphere 和 Payara 之间有区别? (我一直在努力使用 Valve 记录所有内容,但这也失败了,请参阅 [stackoverflow.com/questions/55612705/…
      【解决方案3】:

      您需要重新表述您的问题。

      j_security check 通常用于登录页面。

      如果您请求安全资源但未通过身份验证,则会自动将您重定向到登录页面(假设应用程序配置为使用基于表单的安全性)

      如果您的资源不应该受到 GET 请求的挑战,请按照 Doug 提到的内容进行操作。例如,如果您想保护对 myaccount 的 POST 调用(Servlet 的模式),那么只有在发出 HTTP Post 时,您才会被重定向到登录页面,而即使没有用户身份验证,也会接受 GET 请求。

      这意味着您希望允许经过身份验证的用户访问 POST 请求,而允许所有人访问 GET 请求。

      【讨论】:

        【解决方案4】:

        我正在考虑实施的另一种方法:

        • 在 nginx/apache 等反向代理/负载均衡器中阻止对 j_security_check 的除 POST 请求之外的所有请求

        例如在 Apache 2.4 上这有效:

        <LocationMatch ".*j_security_check">
            AllowMethods POST
        </LocationMatch>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-02
          • 1970-01-01
          • 2020-11-16
          • 1970-01-01
          • 1970-01-01
          • 2016-03-13
          • 2012-08-11
          • 1970-01-01
          相关资源
          最近更新 更多