如何使用boost序列化检测无效输入?

时间:2018-04-17 06:58:08

标签: c++ serialization boost boost-serialization

我有一台接受客户请求的服务器。客户端使用boost序列化来序列化数据,Server对数据进行反序列化以获得实际请求。 攻击者可能会向服务器发送欺诈请求。服务器需要检测无效输入。问题是如何?

  // client request
  char* input = ...;
  int size = ...;
  SomeType to_serialize;
  try {
    boost::iostreams::array_source source(input, size);
    boost::iostreams::stream<boost::iostreams::array_source> source_stream(
        source);
    boost::archive::binary_iarchive iarch(source_stream);
    iarch >> to_serialize;
  } catch (...) {
    ...
  }

目前,当收到无效请求时,服务器可能需要malloc最多1.7TB内存。并发生OOM错误。

1 个答案:

答案 0 :(得分:0)

我认为没有办法。 Boost中没有真正的可移植存档格式。

您可以使用EOS Portable Archive之类的第三方存档。

在继续使用非原始反序列化函数之前,您仍然希望对要发送的归档版本进行编码并进行明确检查。

也许您可以在归档流¹之前设计自己的标题。根据您的有效负载,您也可以在收到完整流后添加校验和。

如果您需要以流模式接收(例如,因为整个流太大而无法容纳在内存中,并且您正在构建映射/共享内存中的数据结构?)并且仍然需要校验和,您可以在基础流中实现这些水平。请参阅https://www.boost.org/doc/libs/1_66_0/libs/iostreams/doc/index.html获取灵感。