質問: "" sub_text << "" << url << "" text.gsub!(url, sub_text) end return text end end ``` 以下で、ユーザーが投稿したテキストを表示しています。 前提としまして、Discussionsテーブルにtext型のcontentカラムがある状況です。 質問したいコードをdivで囲ってidを設定しているのはAjaxでDiscussionのcontentを編集するためです。 app/views/discussions/index.html.erb ``` <% @discussions.each do |discussion| %> <%= simple_format(text_url_to_link(h(discussion.content)), {}, sanitize: false) %> <% end %> ``` 上記のviewファイル内の質問したいコードの流れは以下のようになっていると認識しています。 * discussion.contentでユーザーが投稿したテキストを取得 * hメソッドでタグをエスケープ * 自分で定義したtext_url_to_linkメソッドによりURL形式の文字列をaタグで囲む * simple_formatメソッドをそのまま使用すると、target="_blank"が効かなくなるので、オプションでsanitize: falseを指定 * 最終的にテキスト内のURL形式の文字列がリンクで表示される 上記のコードを書いた状況で ``` ``` と自分が作っている掲示板に投稿したところ、エスケープされて表示されました。 質問内容 ---- 改めて、質問内容を記載致します。以下の2点になります。 * そもそも実装方法が適切か + Gemを使うのがスタンダード、コードがおかしい、など * XSS脆弱性に対処できているか 初心者のため、内容に至らない点もあるかもしれませんが、ご教授いただけますと幸いです。よろしくお願いいたします。
回答: セキュリティは専門でないため、あくまでも私の経験上の話ですが、XSSについて問題がないかどうかは実際にそれに該当するであろうデータを処理させてみて確認した方が間違いないと思います。身も蓋もない答えかもしれませんが、例えば URIに`javascript://`を許すかどうか、といったことは実際に自分で確かめるか、gemに自動テストが付いているなら、そのコードを見て実行させて確認するかしないと、本当の意味では危険性の判断はできないかなと思います。 次にgemを使うべきかどうかは、他プラットフォームのプログラミングをするときとも共通した性質があると思います。 自分が使うサードパーティライブラリが実際に用途に適した動作をするっぽい、と確信できるなら使えばよいでしょうが、やはり実質的にポピュラーなものである方が安心はできるでしょう。前述のセキュリティ周りの問題等についてもポピュラーなものの方がユーザーも多いので、きちんと対処されているのではという期待もある程度できるためです。 その他、gemの更新頻度や問題対処に対するメンテナーの人々の素早さは、できるのであれば確認したほうが良いです。 githubでissueやプルリクエストがやたら溜まっていたり、最終更新日が1年以上経過していた場合、問題があると分かっても対処してもらえないリスクはどうしても高くなってしまいがちです。 この観点から見ると、rails_autolink の方はissueやプルリクエストが溜まったまま放置されているのが気になるといえば気になります。 結局他人の書いたものなので、gemを入れれば入れるほど、プログラムの外部依存性はどんどん高まってしまいます。ですので、そのgemのメンテナンス性に疑問があったり、絶対に自分自身が制御を保証したい場合は、あえて自分で実装するという選択もあり得ると思います。