質問するログイン新規登録

回答編集履歴

1

質問者のコードのセキュリティ的問題点の解説を加えた。

2021/11/29 16:47

投稿

MasaSakano
MasaSakano

スコア188

answer CHANGED
@@ -18,5 +18,7 @@
18
18
 
19
19
  鍵は、`html_safe` (`raw()`)を使うのは、絶対に安全と分かっている文字列に対してだけであるべきという点です。この場合であれば安全が保証できるのは`<br>`だけ。
20
20
 
21
+ (以下、追記: 元のコードでは、`h(@problems)`となっています。したがって、`@problems` の内容にたとえばJavaScriptが紛れ込んでいると、ユーザーの環境でそれが実行されてしまいます。`@problems`はモデル`Problem`で表されるDBテーブルから抽出されています。ほとんどのDBテーブルの値は、何らかの外部入力(多くの場合はフォームなどのユーザー入力)を反映していますから、一般論としては、悪意あるユーザーによってそこに邪悪なコードが紛れ込まれることになる可能性が否定できません。もし現在のアプリの仕様としてその可能性がゼロであれば、現時点ではセキュリティホールにはなりませんね。ただし、仮に現在そうなっていても、一般論として、将来のこのRailsアプリの保守修正においてそうなる可能性を完全否定は難しい、あるいはそれを保証するのは相応の手間です。だから、最初から「安全に」プログラミングしておくことが、推奨されます。端的には、全てリジェクトして、絶対に安全と確証を持てるものだけを通すスタイルです。その一つの例がこの回答でした。)
22
+
21
23
  現実には、想定している状況次第で、もっとスマートに書けるでしょう。たとえば、入力文字列の普通の改行コードはすべて`<br>`に変換する、と仮定できるならば、もっとスマートに書けるでしょう。
22
24
  質問者が想定している詳しい状況がわからないので、上の例は汎用的に使えるように書いたものです。