2024年12月4日に発表された変更点
C++版ProtobufデバッグAPI(Protobuf AbslStringify、`proto2::ShortFormat`、`proto2::Utf8Format`、`Message::DebugString`、`Message::ShortDebugString`、`Message::Utf8DebugString`を含む)をv30において変更し、`debug_redact`で注釈付けされた機密フィールドを編集する予定です。これらのAPIの出力にはプロセスごとのランダムなプレフィックスが含まれるため、Protobuf TextFormatパーサーで解析できなくなります。
動機
現在、ProtobufデバッグAPIは、proto内のすべてのフィールドを人間が読める形式で出力します。これにより、開発者が機密フィールドを含むProtobufデバッグ出力を誤ってログに記録してしまうというプライバシー事故につながる可能性があります。
機密フィールドの注釈付け方法
フィールドを機密としてマークするには2つの方法があります
フィールドオプション`debug_redact = true`を直接使用してフィールドをマークします。
message Foo { optional string secret = 1 [debug_redact = true]; }
`proto2.FieldOptions`を拡張してEnum型のフィールド注釈を既に定義しており、この注釈の特定の値が、編集したいフィールドに注釈を付けるために使用されている場合、これらの値を`debug_redact = true`で注釈付けすることができます。そのような値で注釈付けされたすべてのフィールドは編集されます。
package my.package; extend proto2.FieldOptions { # The existing field annotation optional ContentType content_type = 1234567; }; enum ContentType { PUBLIC = 0; SECRET = 1 [debug_redact = true]; }; message Foo { # will not be redacted optional string public_info = 1 [ (my.package.content_type) = PUBLIC ]; # will be redacted optional string secret = 1 [ (my.package.content_type) = SECRET ]; }
新しいデバッグ形式
既存のデバッグ形式と比較して、新しいデバッグ形式には2つの大きな違いがあります
- `debug_redact`で注釈付けされた機密フィールドは、出力形式で自動的に編集されます
- 出力形式にはプロセスごとのランダムなプレフィックスが含まれるため、TextFormatパーサーで解析できなくなります。
2番目の変更点は、protoに機密フィールドが含まれているかどうかにかかわらず適用されることに注意してください。これにより、protoの内容にかかわらず、すべてのデバッグ出力が常にデシリアライズできないことが保証されます。