わかりました。PHPサーバーからデータが提供されるパブリックJSONPAPIを実行しています。私はちょうどこの記事を読みました:
- JSON:そうでないJavaScriptサブセット(MagnusHolmによる;2011年5月)
(説明のために読んでください)
基本的に、JSON文字列にU + 2028文字(Unicode行区切り文字)またはU + 2029文字(Unicode段落区切り文字)が含まれている場合、これは完全に有効なJSONです。ただし、JSONPを使用する場合、JSONはJavaScriptとして実行され、JavaScriptを壊すため、JavaScriptの文字列にリテラルU+2028またはU+2029を含めることはできません。明らかに、適切なJSONパーサーを使用している限り、これは通常問題にはなりませんが、JSONPの場合、ブラウザーはJSONパーサーです。
基本的に、これらの文字がクライアントに送信されるJSONPデータの文字列内にある場合、これにより文字列に行または段落の区切りがスローされ、JavaScriptが破損して実行が停止します。これは、APIがクライアントが入力したデータを送り返す可能性があるためです。誰かがU+2028またはU+2029をデータベースに入力する可能性があるため、それをJSONPとして返送すると、APIを使用した実装が破損します。
だから私の質問は、PHPでJSONデータをサニタイズ/出力エスケープして、クライアントに送信する前にU+2028およびU+2029文字を削除またはエスケープするにはどうすればよいですか?
現在、私のプロセスはデータの配列に対してjson_encodeを実行し、そのデータをクライアントに送信しています。配列をループしてフィルタリングすることでデータをエスケープする必要がありますか、それともすべてのJSONエンコード文字列を一度にエスケープする必要がありますか?
もう1つは、PHPでU+2028およびU+2029文字をエスケープする方法がわからないことです。str_replaceを実行できますか?str_replaceがマルチバイトセーフであるかどうかはわかりません。また、カスタムメイドの関数を使用しない限り、mb_str_replace関数はありません。では、これらのUnicode文字をどのように削除/エスケープしますか?
どうもありがとう。