一尘不染

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

tomcat

重新跟踪这个GWT-RPC问题(和答案1)。字段大小检查,我想知道检查 反序列化前
发送给服务器的最大数据大小的正确方法,例如 如果请求数据大小 >
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请求的最大大小-即,最大 rpc1 大小为50 kB,最大 rpc2 大小为1 MB?
  4. 如果可能,在哪里/如何配置/检查每个rpc请求参数的最大大小-即 a 为10 kB, b 为40 kB, c 为1 MB, d 为1 kB。我怀疑进行反序列化是可行的,不是吗?
  5. 出于成本/收益的实际目的,通常建议使用什么级别的反序列化前检查-1.全局,2. servlet,3. rpc,4.对象参数?换句话说,上述每个反序列化前级别检查的成本复杂度一方面是多少,另一方面增值是多少?

在此先感谢。


阅读 246

收藏
2020-06-16

共1个答案

一尘不染

根据我提出问题以来所学的知识,直到有人可以更好地向我展示我的答案和策略是:

  1. 防御和检查的第一行是在httpd.conf中设置的Apache LimitRequestBody。它是所有小服务程序中所有rpc调用的总最大数。
  2. 第二道防线是通过重写GWT AbstractRemoteServiceServlet.readContent进行servlet预反序列化。例如,一个人可以做到,我想下面会进一步展示。这就是我要研究的这个问题的核心。
  3. 然后,可以进一步检查反序列化后的每个rpc调用参数。可以方便地在服务器端和客户端使用JSR 303验证-请参阅参考S和gwt re客户端。

有关如何重写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;
}

如果最大请求大小大于2GB,请参阅此问题

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

2020-06-16