GWT-RPC,Apache,Tomcat服务器数据大小检查

时间:2012-11-12 03:28:33

标签: apache security gwt tomcat rpc

跟进this GWT-RPC question (and answer #1) re. field size checking,我想知道检查发送到服务器的最大数据大小的预反序列化的正确方法,如请求数据大小> ; X然后中止请求。重视简单性并基于上述问题/答案的答案,我倾向于认为检查最大总体请求大小就足够了,更细粒度的检查(即字段级别检查)可以推迟到反序列化后,但我对任何开放最佳实践建议。

感兴趣的技术堆栈:与Apache-Tomcat前端Web服务器的GWT-RPC客户端 - 服务器通信。

我想第一步是全局限制任何请求的大小(httpd.conf中的 LimitRequestBody 或/和其他?)。 是否有可以根据RPC请求设置的更细粒度的检查?如果是这样,怎么样?精细谷物检查在一个全球环境中带来多少安全价值?

要使用示例更具体地构建问题,假设我们在同一个servlet上有以下两个RPC请求签名:

public void rpc1(A a, B b) throws MyException;
public void rpc2(C c, D d) throws MyException;

假设我大致知道以下最大尺寸:

  • a:10 kB
  • b:40 kB
  • c:1 M B
  • d:1 kB

然后我希望以下最大尺寸:

  • rpc1:50 kB
  • rpc2:1 MB

在本例中,我的问题是:

  1. 在何处/如何配置任何请求的最大大小 - 即上述示例中的1 MB?我相信它是httpd.conf中的 LimitRequestBody ,但不能100%确定它是否是唯一用于此目的的参数。
  2. 如果可能,在哪里/如何配置每个servlet的最大大小 - 即我的servlet中任何 rpc 的最大大小是1 MB?
  3. 如果可能,在哪里/如何配置/检查每个rpc请求的最大大小 - 即,max rpc1 大小是50 kB而max rpc2 大小是1 MB?
  4. 如果可能,在哪里/如何配置/检查每个rpc请求参数的最大大小 - 即 a 是10 kB, b 是40 kB, c 为1 MB, d 为1 kB。我怀疑进行后反序列化是否具有实际意义,不是吗?
  5. 出于实际目的,基于成本/收益,通常建议使用什么级别的预反序列化检查 - 1. global,2。servlet,3. rpc,4。object-argument?换句话说,一方面大致是成本复杂性,另一方面是上述每个反序列化级别检查的附加价值是什么?
  6. 非常感谢。

1 个答案:

答案 0 :(得分:0)

根据自从我提出这个问题后所学到的知识,我自己的答案和策略,直到有人能够更好地向我展示:

  1. 第一道防线和检查是在httpd.conf中设置的Apache的LimitRequestBody。它是所有servlet中所有rpc调用的总体最大值。
  2. 第二道防线是通过覆盖GWT AbstractRemoteServiceServlet.readContent来进行servlet预反序列化。例如,我可以在下面进一步说明这样做。这是我在这个问题上捕鱼的核心。
  3. 然后可以进一步检查反序列化后的每个rpc调用参数。可以方便地在服务器端和客户端使用JSR 303验证 - 参见参考StackOverflowgwt r.e。客户方。
  4. 有关如何覆盖AbstractRemoteServiceServlet.readContent的示例:

    @Override 
    protected String readContent(HttpServletRequest request) throws ServletException, IOException
    {
      final int contentLength = request.getContentLength();
      // _maxRequestSize should be large enough to be applicable to all rpc calls within this servlet.
      if (contentLength > _maxRequestSize)
        throw new IOException("Request too large");
      final String requestPayload = super.readContent(request);
      return requestPayload;
    }
    

    如果>是最大请求大小,请参阅this question 2GB。

    从安全角度来看,这个策略对我控制用户发送到服务器的数据大小似乎很合理。