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でくくるのを忘れないように!