コンピューティングにおいて、堅牢性の原則とはソフトウェアの設計ガイドラインであり、「自分の行動には保守的、他者からの受け入れには寛容」というものです。これはしばしば「送信には保守的、受け入れには寛容」と言い換えられます。この原則は、TCPの初期の仕様でこの表現を用いたジョン・ポステルにちなんで、ポステルの法則としても知られています。[ 1 ]
つまり、他のマシン (または同じマシン上の他のプログラム) にメッセージを送信するプログラムは仕様に完全に準拠する必要がありますが、メッセージを受信するプログラムは意味が明確である限り、非準拠の入力を受け入れる必要があります。
プログラマーの間では、互換性のある関数を作成するための原則は、入力型では反変、出力型では 共変であるという形式でも知られています。
この原則は、1979年のIPv4仕様においてジョン・ポステルによって初めて記述されました。[ 2 ] 1989年、ボブ・ブレイデンはポステルの原則を拡張し、プログラマーに対し「ネットワークは、最悪の影響を及ぼすように設計されたパケットを送信する悪意のあるエンティティで満ちていると想定する」ことを推奨しました。[ 3 ]プロトコルは、未知のコードを持つメッセージを受け入れる(場合によってはログに記録する)ことで、将来のバージョンのプロトコルにおいて既存のフィールドに新しいコードを追加できるようにする必要があります。プログラマーは、受信者の欠陥を露呈させる可能性のある「合法だが分かりにくいプロトコル機能」を持つメッセージの送信を避け、「他の不正なホストから生き残るだけでなく、そのようなホストが共有通信設備に引き起こす混乱を最小限に抑えるように」コードを設計する必要があります。[ 4 ]
2001年、マーシャル・ローズは、ポステルの原理を新しいアプリケーションプロトコルの設計に適用する際に生じるいくつかの導入上の問題を特徴づけました。[ 5 ]例えば、仕様に準拠していないメッセージを送信する欠陥のある実装は、仕様からの逸脱を許容する実装でのみ使用され、場合によっては数年後には、そのメッセージを拒否する、より許容度の低いアプリケーションに接続される可能性があります。このような状況では、問題を特定することが困難になることが多く、解決策の導入にはコストがかかる可能性があります。そのため、ローズは「たとえ実装のオーバーヘッドが生じるとしても、プロトコルにおける明示的な整合性チェック」を推奨しました。
2018年、フロレンティン・ロシェとオリヴィエ・ペレイラによるプライバシー強化技術に関する論文では、Torルーティングプロトコル内部のポステルの堅牢性原理を利用して、オニオンサービスとTorクライアントの匿名性を侵害する方法が示されました。[ 6 ]
2023年、マーティン・トムソンとデビッド・シナジは、ポステルの堅牢性原理は実際にはセキュリティを含む堅牢性の欠如につながると主張した。[ 7 ]
欠陥は事実上の標準として定着する可能性があります。プロトコルの実装は、異常な動作を再現することが必須であり、そうでなければ相互運用性がありません。これは、予期せぬ事態を許容することの結果であると同時に、致命的なエラー状態を避けようとしないという自然な抵抗の産物でもあります。このような環境における相互運用性を確保することは、しばしば「バグ対バグの互換性」を目指すことと呼ばれます。
{{cite book}}: CS1 maint: 複数の名前: 著者リスト (リンク)