Rails 4 で to_json が Unicode を自動的にエスケープするのはなぜですか? 質問する

Rails 4 で to_json が Unicode を自動的にエスケープするのはなぜですか? 質問する

レール3:

{"a" => "<br/>"}.to_json
=> "{\"a\":\"<br/>\"}"

レール4:

{"a" => "<br/>"}.to_json
=> "{\"a\":\"\\u003Cbr/\\u003E\"}"

なぜ???

エラーの原因となっているようです

Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8

Rails 3 アプリが Rails 4 アプリによって生成された JSON を解析しようとするとき。

ベストアンサー1

なぜ???

Web アプリケーションの一般的な弱点を防御します。たとえば、HTML ページで次のように記述します。

<script type="text/javascript">
    var something = <%= @something.to_json.html_safe %>;
</script>

JavaScript に挿入するデータを JSON エスケープしているので問題ないと思うかもしれません。しかし、実際には安全ではありません。JSON 構文の他に、HTML 構文も囲んでおり、HTML スクリプト ブロックでは</インバンド シグナリングが行われます。実際には、@something文字列が含まれている場合</script>、次のようにクロスサイト スクリプティングの脆弱性が発生します。

<script type="text/javascript">
    var something = {"attack": "abc</script><script>alert('XSS');//"};
</script>

最初のスクリプト ブロックは文字列の途中で終了し (閉じられていない文字列リテラル構文エラーが残ります)、2 番目は<script>新しいスクリプト ブロックとして扱われ、その中のユーザーが送信した可能性のあるコンテンツが実行されます。

文字をエスケープする<ことは\u003CJSON では必須ではありませんが、これは完全に有効な代替手段であり、この種の問題を自動的に回避します。JSON パーサーがこれを拒否した場合、それはリーダーの重大なバグです。

このエラーを発生させているコードは何ですか? エラーは 0x3C ではなくバイト 0xC3 について話しているようなので、このエラーが -escaping と関係があるとは思えません<。これは、UTF-8 でエンコードされたコンテンツを含む文字列が UTF-8 としてマークされていないことを示している可能性があります...force_encoding("UTF-8")入力に が必要でしょうか?

おすすめ記事