思考gRPC :为什么是protobuf

  • 时间:
  • 浏览:1
  • 来源:神彩大发幸运飞艇_彩神大发幸运飞艇官方

事实上的跨语言序列化方案不才能有有有另三个白: protobuf, thrift, json。

protobuf把一切都框住了,少了灵活性,自然就少漏洞。

才能 看一遍rpc的定义也是写在proto文件里的。实际上gRPC是protobuf的有有有另三个白扩展,通过扩展生成gRPC相关的代码。

jackson-databind

同样thrift有:

protobuf的其他缺点:

通常是在IDL文件里写好package和类名,生成的代码直接总要 了类型信息。比如protobuf, thrift。缺点是需要生成代码,双方总要 知道IDL文件。

protobuf在google 30008年公开的,内部管理使用自然更早。当时速度还比较昂贵,现在他们对速度的关注胜过速度了。

thrift,小米,美团等

为何会么会在protobuf里并不才能 什么反序列化大大问题?

谈到RPC,就出理 不了序列化的话题。

什么都有 总结下来,要么白名单,要么黑名单。当然黑名单机制不才能及时更新,业务方得不断升jar包,非常蛋疼。白名单是比较彻底的出理 方案。

fastjson

什么都有 程序运行运行员不理解为何会么会反序列化才能 造成任意代码执行。

在protobuf出来事先 ,什么都有 我断出現新的方案。比如

各种序列化库层出不穷,其包含有有有另三个白重要的区别:类型信息存倒入哪

这里有有有有另三个白生成java序列化漏洞代码的工具:

类型信息看起来是有有有另三个白小事,但在安全上却会出大大大问题,后面 会讨论。

序列化什么都有 我把对象转换为二进制数据,反序列化就把二进制数据转换为对象。

Java Serialization

下面来看下常见的序列化方案是为何会么会出理 反序列化漏洞的:

这里讨论的是不才能 IDL定义的序列化方案,比如java自带的序列化,hessian, 各种json库。

hessian, 阿里用的是当时人维护的版本,有js/cpp的实现,肯能阿里主用java,更多是历史由于。

国内其他大公司的使用情況:

什么序列化漏洞的根本由于是:不才能 控制序列化的类型范围

典型的是各种json序列化库,优点是灵活,缺点是使用的双方总要 知道类型是什么。当然有其他json库会提供其他扩展,偷偷把类型信息插入到json里。

gRPC默认的序列化办法是protobuf,由于很简单,肯能两者总要 google发明权者的,哈哈。

在当初Google开源protobuf时,什么都有 人就期待算是能把RPC的实现也同时开源出来。没想到最终出来的是gRPC,终于补全了有一种块。

以gRPC官方的Demo为例:

反序列化漏洞到底是为何会么会工作的呢?好难直接描述清楚,什么漏洞总要 很精巧的设计,把多个地方的代码串联起来。才能 参考有一种demo,跑起来调试下就才能 有直观的印象:

解码需要复制一份内存,不才能做原地内存引用的优化

比如java自带的序列化,hessian等。缺点是类型信息冗余。比如RPC里每有有有另三个白request总要 带上类型。什么都有 我有有一种常见的RPC优化手段什么都有 我两端协商事先 ,后续的请求需要再带上类型信息。

protobuf ,腾迅,百度等

在生成代码里带上类型信息

才能 分为有一种:

不保存类型信息

类型信息保存到序列化结果里

protobuf需要生成代码的确有点麻烦,什么都有 会有基于java annotation的方案: