Sanitize gem remove allowed attributes with colon

Mail gem でパーズしたHTMLを表示するので、XSSを起こさないようエスケープしないといけない。

なんでや!

imgタグのsrc属性に「cid:」値が先頭に入っているのだけど、
Sanitize gemでsanitizeするとsrc属性ごと削除されてしまう。なんでや!
試行錯誤していると「cid:」という文字列が原因で削除されているみたい。

[22] pry(#<MailBodyParser>)> Sanitize.clean("<img src=\"cid:hoge\" >", Sanitize::Config::RELAXED)
=> "<img>"

おっ

属性のプロトコルまでチェックするのか......しゅごい(´・ω・`)

Sanitize::Config::RELAXED にどのタグ、属性などを許可するというハッシュが入っているのでcid:を許可するように値を追加する。

Sanitize::Config::CUSTOM_RELAXED = Sanitize::Config::RELAXED.merge(
  protocols: {
    "img" => {
      "src"=>[
        'http',
        'https',
        'cid',
        :relative,
      ]
    }
  }
)
[2] pry(main)> Sanitize.clean("<img src=\"cid:hoge\" >", Sanitize::Config::CUSTOM_RELAXED)
=> "<img src=\"cid:hoge\">"

おしまい

参考
http://stackoverflow.com/questions/5973552/sanitize-gem-doesnt-like-colon-inside-href-attribute