代码之家  ›  专栏  ›  技术社区  ›  SAL9000

如何限制通过objectinputstream从套接字读取的最大大小?

  •  1
  • SAL9000  · 技术社区  · 17 年前

    有没有办法限制Java中ObjistIdPoSt流读取的最大缓冲区大小?

    如果清楚地表明所讨论的对象是恶意地构建的,那么我希望停止反序列化。

    当然,还有objectinputstream.read(byte[]buf,int off,int len),但是我不想遭受分配的性能惩罚,比如byte[1000000]。

    我是不是错过了什么?

    3 回复  |  直到 17 年前
        1
  •  5
  •   Jon Skeet    17 年前

    你写的 FilterInputStream 如果它发现从其底层流中读取的数据超过了一定数量,则会引发异常。

        2
  •  2
  •   CPerkins    17 年前

    我可以看到两种方式:
    1)在一个循环中进行读取,抓取您满意的分配大小的块,并在达到限制时退出和停止;或 2)分配一次最大大小的缓冲区,然后重新使用它进行后续读取。

        3
  •  1
  •   Aviad Ben Dov    17 年前

    实际上,有一个非常简单的方法。

    您可以使用NIO的byteBuffer,并使用allocateDirect方法。这个方法将允许您分配一个内存映射文件,因此它没有很大的开销,您可以限制它的大小。

    然后,不从套接字获取流,而是获取通道。

    代码:

        Socket s;
    
        ByteBuffer buffer = ByteBuffer.allocateDirect(10 * 1024 * 1024);
        s.getChannel().read(buffer);
    

    现在,不要尝试在字节缓冲区上调用“array()”方法;它不能在直接分配的缓冲区上工作。但是,你可以 wrap the buffer as an input stream 并将其发送到objectinputstream进行进一步处理。