🫡

RubyのhメソッドとCGI.escapeの違い

2023/12/23に公開

はじめに

るりまでhメソッドについて調べると、以下のように記載されています。

(CGI.escapeHTMLとほぼ同じです)。

この表現から、「何が違うのか?」と疑問に思い、調査した結果を備忘録としてまとめます。

hメソッドについて

まず、hメソッドはhtml_escapeのエイリアスです。

このメソッドは、与えられた文字列中に含まれる以下の文字を変換します。

&&
""
<&lt;
>&gt;
これらはそれぞれ対応するHTMLエンティティに変換されます。

CGI.escapeについて

CGI.escapeメソッドは与えられた文字列をURLエンコードして返します。
URLエンコードとは、URLで使用できない文字を変換することを指します。
そのまま使用できる文字は以下です。

  • アルファベット
  • 数字
  • 一部の記号(-, _, ., ~)

何が違うの?

CGI.escapeは、URLで使用できない文字すべてをエンコードします。
一方、hメソッドは特定の4つの記号のみを変換します。
したがって、これらのメソッドの用途が異なります。

hメソッドの用途

hメソッドはXSS(クロスサイトスクリプティング)対策のために使用されます。
これにより、XSS攻撃に利用される特定の記号を対象にエスケープを行います。

CGI.escapeの用途

CGI.escapeは、URLを正しく機能させるために使用されるメソッドです。
これにより、URL内の特殊文字を安全にエンコードすることができます。

まとめ

Railsでは、ERBテンプレートの<%= %>を使うことで自動的にエスケープ処理が行われるため、通常はこれらのメソッドについて深く考える必要はありません。
しかし、html_safeメソッドを使用することで生じるセキュリティの脆弱性に対処する過程で、これらのメソッドの重要性を改めて認識しました。

GitHubで編集を提案

Discussion