質問: ERB、paramsを使用しています。 paramsで受け取ったものにgusbする、 ``` content.gusb(/\r\n|\r|\n/, "") ``` をどこに使うのか。 テキストエリア(content)に入力された改行結果を、上記のコードを使って表示するにはどうしたらいいんですか? ![このコードのどこにメソッドを入れるのかわからない](https://i.stack.imgur.com/qZcnk.png) 用意した入力フォーム ![こういった入力フォーム](https://i.stack.imgur.com/TavlA.png) 入力した結果は以下の画面に反映させたいと思っています。 ![入力した結果をここに反映させたい](https://i.stack.imgur.com/ejdHB.png)
回答: 改行が表示上でも改行させたいだけであれば、改行を``に置き換えるのではなく、下記のようにCSSでwhite-spaceを設定し、改行が改行として表示させるようにすることをお勧めします。 ``` <%=contact%> ``` ※ white-spaceを何にすべきかは場合によりけりです。上では改行だけ改行させるとして、他の空白は通常と同じ動作です。 ※ 実際はstyle属性では無くclassを設定して別途指定することをお勧めします。内容によっては``で囲うなどをしても良いかもしれません。 【解説】 単純に思い浮かぶのは次のような方法です。 ``` <%=contact.gsub(/\r\n|\r|\n/, "")%> ``` やってみればわかりますが、これはうまくいきません。``が`<br>`と自動的にエスケープされてしまうため、改行では無く""とそのまま表示されてしまいます。このエスケープを抑止する方法としては単純に`<%== %>`を使う方法があります。 ``` <%==contact.gsub(/\r\n|\r|\n/, "")%> ``` エスケープが抑止され、改行がされるようになりました。しかし、この方法は**絶対にやってはいけません**。このコードには **XSS(クロスサイトスクリプティング)脆弱性**があり、重大なセキュリティ上の問題を引き起こします。他にも`<%=raw contact.gsub(/\r\n|\r|\n/, "")%>`とか`<%=contact.gsub(/\r\n|\r|\n/, "").html_safe%>`といった方法もありますが、脆弱性の問題は何も解決していないため、これまた**絶対にやってはいけません**。 では、どうしたら良いのかというと、改行部分は``にしてエスケープしたくないが、改行以外の部分はちゃんとエスケープしてXSSを回避するようにします。例えば、次のように書く方法です。 ``` <%==contact.split(/\r\n|\r|\n/).map{|s|h(s)}.join('')%> ``` このコードは、改行区切りで分割して、それぞれを`h`でエスケープし、``を挟みながら結合、必要なエスケープ処理は全て終わっているのでそのまま表示という意味です。または次の方法の方が見た目は良いかもしれません。 ``` <%==h(contact).gsub(/\r\n|\r|\n/, "")%> ``` こちらは最初に全てエスケープしてから、改行を置き換えるという方法です。ただ、いずれの場合もエスケープ処理に抜けが無いか注意深くコーディングする必要があります。少し複雑な置き換えパターンが出てくると、想定に漏れがあり、脆弱性を仕込んでしまうことも珍しくありません。 ということで、そんな小難しいことを考えて、脆弱性があるかも知れないと心配になるより、今回はCSSで改行が改行されるようにwhite-spaceを設定した方が楽だと思い、最初のコードに戻ると言うことです。