Loofah の URI 安全性チェックを Rails::HTML::Sanitizer に委譲
Rails フレームワークが Loofah への直接依存なしに URI の安全性を検証できるようになりました。Rails::HTML::Sanitizer.allowed_uri? メソッドの追加により、Rails 側で URI プロトコルの安全性チェックを統一的に実行できます。
背景
Rails フレームワーク内で URI の安全性を検証する際、これまでは Loofah への直接依存が必要でした。Loofah::HTML5::Scrub.allowed_uri? を呼び出すには、Rails 側のコードに Loofah への参照を記述する必要があり、依存関係の境界が曖昧になっていました。#214 は、この依存関係を rails-html-sanitizer 層で吸収する変更です。
Rails のサニタイザー機能は既に Loofah に依存しているため、URI 検証機能も同じ抽象化レイヤーで提供することで、Rails フレームワーク側のコードをシンプルに保てます。
技術的な変更
lib/rails/html/sanitizer.rb に allowed_uri? クラスメソッドが追加され、Loofah の同名メソッドに処理を委譲します。
def allowed_uri?(uri_string)
Loofah::HTML5::Scrub.allowed_uri?(uri_string)
end
このメソッドは、https://、http://、mailto: などの安全なプロトコルには true を返し、javascript: などの危険なプロトコルには false を返します。相対 URI(/relative/path)も安全として扱われます。
def test_allowed_uri_returns_true_for_allowed_protocols
assert(Rails::HTML::Sanitizer.allowed_uri?("https://example.com"))
assert(Rails::HTML::Sanitizer.allowed_uri?("http://example.com"))
assert(Rails::HTML::Sanitizer.allowed_uri?("mailto:user@example.com"))
end
def test_allowed_uri_returns_false_for_disallowed_protocols
refute(Rails::HTML::Sanitizer.allowed_uri?("javascript:alert(1)"))
end
Loofah の最小依存バージョンが ~> 2.21 から ~> 2.25 に引き上げられました。これは Loofah::HTML5::Scrub.allowed_uri? が Loofah 2.25 で公開 API として追加されたためです。
- spec.add_dependency "loofah", "~> 2.21"
+ spec.add_dependency "loofah", "~> 2.25"
設計判断
委譲パターン による薄いラッパーが採用されました。
PR の実装は、Loofah のメソッドをそのまま呼び出すだけの単純な委譲です。独自のロジックを追加せず、プロトコルの安全性判定は Loofah に完全に任せる設計です。これにより、URI 検証ロジックの重複を避けつつ、Rails フレームワーク側には安定した API を提供できます。
Loofah のバージョン要件を 2.25 以上に引き上げることで、allowed_uri? が公開 API として利用可能であることを保証しています。この判断により、内部実装への依存を避け、Loofah 側の変更に対する耐性を高めています。
本 PR は、既存の依存関係を活用しながら Rails フレームワークに統一的な URI 検証手段を提供する変更です。委譲パターンによる薄い抽象化により、Loofah への直接依存を隠蔽し、Rails 側のコードの保守性を向上させています。