RailsでのURLのバリデーションについて探すと次のような書き方がよく出てきます。
validates :url, format: URI::regexp(%w(http https))
URLの正規表現は真面目に書こうとすると複雑なものになりますが、URI::regexp
がURLの正規表現を返してくれるのでこれを利用するのが手軽ですね。
と思ってたんですが、外部の脆弱性検査で指摘されて気付いたけど、これだめなやつだった!
先頭&末尾が考慮されていないので、次のような文字列も受け付けてしまう。これはまずい。
javascript:alert('XSS');//https://bitarts.jp/
こうしましょう。
validates :url, format: /\A#{URI::regexp(%w(http https))}\z/
これに限らず、validates formatを使う場合は\A
〜\z
でくくるのを忘れないように!