ADR-0009: One canonical target parser and a versioned address corpus 

Status

Historical proposal (original status: Proposed)

Date

2026-10-08

Original decision makers

Project architecture/security owners; approval still pending in the original proposal.

Requirements

HG-007, HG-008, HG-009, HG-010, HG-011, HG-012

Original supersession

None; a new decision for the proposed product.

Context 

Parsers interpret noncanonical numeric addresses differently. The Host header and URI may disagree. A coarse private-IP filter does not cover every local or special address class. IANA maintains separate IPv4/IPv6 special-purpose registries.

Sources: [S04, S05, S10, S11].

Decision 

The guard normalizes once, then uses a typed Target and applies the same authority to transport. Absolute HTTP/HTTPS URLs are mandatory; userinfo, fragments, control characters, zone IDs, host percent encoding and noncanonical numeric forms are rejected. After normalization, HTTP Host and URI authority must agree. Unicode hostnames are not implicitly converted in v1; ASCII IDNA names already converted canonically are permitted.

IP and CIDR checks use binary representations for both families. IPv4-mapped IPv6 is evaluated against the embedded IPv4 policy. Tunneling/translation ranges are conservatively blocked. The versioned corpus names private ranges, loopback, link-local, metadata relevance, multicast, documentation/benchmark and other special ranges.

The v1 public policy is deliberately more conservative than merely accepting the positive Globally-Reachable marking of individual special addresses. Operator deny can additionally block nominally public ranges routed internally. Registry updates are versioned, never downloaded live for every request.

Rejected alternatives 

  • Regular expressions alone: unsuitable for comprehensive IP/CIDR decisions.
  • PHP filter flags alone: implicitly couples policy to their particular runtime semantics.
  • Private IPv4 without IPv6: leaves a second address family open.
  • Accept every parser correction: increases interpretation differences.

Consequences 

There is one testable decision path and traceable dataset versions. Some legitimate special addresses and Unicode inputs are restricted; callers must supply canonical targets. A public IP still does not mean "a server whose content is trustworthy".

Evidence and acceptance in the original proposal 

T008, T009, T010, T011, T012, T013, T014, T015, T016, T017, T018, T019, T020, T021. Details and expected results are in Original verification specification. These tests were specified, not executed as part of the original documentation delivery.

Reasons to reconsider 

Relaxing a blocked address class or parser form requires a corpus change, justification and boundary tests. New IANA entries are treated like security-relevant dependency changes.