0

跟进这个 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;

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

  • 一个:10 KB
  • b: 40 KB
  • c: 1字节
  • 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. 对象参数?换句话说,上述每个反序列化前级别检查一方面的成本复杂性和另一方面的附加值大致是多少?

提前非常感谢。

4

1 回答 1

0

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

  1. 第一道防线和检查是 Apache 在 httpd.conf 中设置的 LimitRequestBody。它是所有 servlet 中所有 rpc 调用的总体最大值。
  2. 第二道防线是通过覆盖 GWT AbstractRemoteServiceServlet.readContent 对 servlet 进行预反序列化。例如,我想可以按照下面进一步显示的方式进行操作。这是我在这个问题中所追求的核心。
  3. 然后可以在反序列化后进一步检查每个 rpc 调用参数。可以方便地在服务器端和客户端使用 JSR 303 验证——参见参考StackOverflowgwt 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,请参阅此问题。

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

于 2013-01-07T03:01:02.580 回答