用いる必要があります。使って完全一致のバリデーションを行うと脆弱性が入りやすいワナとなります。使うようにしましょう。Guideからの引用として紹介されています。以下の正規表現は、XSS対策として、httpスキームあるいはhttpsスキームのURLのみを許可する正規表現のつもりです。/^https?:\/\/[^\n]+$/iしかし、Rubyの場合、以下の入力が上記正規表現にマッチしてしまいます。javascript:exploit_code();/*http://hi.com*/確かに、これはすごいワナです。このようなことが起こるのでしょうか。その理由は下記の2点にあります。「行」の先頭・末尾を指します。デフォルトで複数行モードこちらはRuby特有の仕様ですが、Rubyの正規表現は、デフォルトでPerlやPHPのm修飾子を指定したような動作となります。PerlやPHPの場合は、文字列の途中に改行があった場合でも、文字列全体を1行と見なします。m修飾子を指定した場合は、改行を行の区切りと見なし、複数行として処理します。)という正規表現は、「xxxに一致する行がある場合にマッチ」となります。s修飾子にあたるもので、メタ文字ドット「.」が改行にマッチするようにする指令です。いうhttpスキームのURLがあるため正規表現がマッチして、「正しい入力」とみなされたことになります。XSS以外の脆弱性の可能性この問題はXSS以外の脆弱性になる可能性があります。\zを文字列の先頭・末尾を示すメタ文字として使用します。私の観測範囲では、Ruby界隈では元々よく知られている内容と思いますが、大垣さんの指摘のように、他の言語からRubyに移ってきた人には落とし穴になりそうです。「行」の先頭と末尾を示します。使って完全一致マッチングを指定していますが、これは間違いということになります。それでは、過去のPHP(やPerl等)のスクリプトが、これが原因で脆弱性だらけになるかというと、そうではありません。マッチすることはないからです。(改行の直前に)マッチしてしまいます。(マッチした)を返します。(マッチしない)を返します。$で完全一致のチェックをしているつもりでも、データ末尾に改行が含まれている場合を見逃してしまうという問題があります。意味が正しく説明されていました。これは、まぁyuguiさんなら当然でしょうが。は正しい記述があります。第1版の方は間違っておりますので、まだ第1版をお使いの方は、この機に第2版を買いましょう(お勧め)。