🫡
RubyのhメソッドとCGI.escapeの違い
はじめに
るりまでhメソッドについて調べると、以下のように記載されています。
(CGI.escapeHTMLとほぼ同じです)。
この表現から、「何が違うのか?」と疑問に思い、調査した結果を備忘録としてまとめます。
hメソッドについて
まず、hメソッドはhtml_escapeのエイリアスです。
このメソッドは、与えられた文字列中に含まれる以下の文字を変換します。
& ⇒ &
" ⇒ "
< ⇒ <
> ⇒ >
これらはそれぞれ対応する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メソッドを使用することで生じるセキュリティの脆弱性に対処する過程で、これらのメソッドの重要性を改めて認識しました。
Discussion