ブラウザで次のコードを実行してみてください。
eval("(function() { console.log(JSON.parse('" + JSON.stringify('THIS IS COOL') + "')); })()");
THIS IS COOL
ただし、これを実行すると、次のように出力されます。
eval("(function() { console.log(JSON.parse('" + JSON.stringify('THIS IS "NOT" COOL') + "')); })()");
印刷する代わりに失敗しますTHIS IS "NOT" COOL
誰かがなぜこれが起こるのか説明できますか?
これに注意してください:
の結果JSON.stringify('THIS IS "NOT" COOL')
は文字列です"THIS IS \"NOT\" COOL"
を実行しようとするJSON.parse("THIS IS \"NOT\" COOL")
と失敗します。これは、JS パーサーが文字列"THIS IS \"NOT\" COOL"
を として解釈するため"THIS IS "NOT" COOL"
です。
を実行するJSON.parse(JSON.stringify('THIS IS "NOT" COOL'))
と、文字列"THIS IS \"NOT\" COOL"
が に直接渡されるため、機能しますJSON.parse
。
このシナリオでは機能するのに、前のシナリオでは機能しないのはなぜですか?
私の唯一の結論は、コードを実行する前に eval が渡されたものすべてを明示的にアンエスケープするということですが、それを確実に知り、なぜ eval がこのように動作するように設計されているのかを理解したいと思います。