2024年12月4日に発表された変更点
v30において、C++用のProtobufデバッグAPI(Protobuf AbslStringify、proto2::ShortFormat
、proto2::Utf8Format
、Message::DebugString
、Message::ShortDebugString
、Message::Utf8DebugString
を含む)を修正し、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の内容に関係なく、いかなるデバッグ出力も常にデシリアライズできなくなります。