JSON:スラッシュがエスケープされるのはなぜですか?


369

これの理由は私を「脱出」させます。

JSONはスラッシュをエスケープするため、ハッシュ{a: "a/b/c"}はでは{"a":"a\/b\/c"}なくとしてシリアル化されます{"a":"a/b/c"}

どうして?


4
FWIW私はフォワードスラッシュがJSONでエスケープされるのを見たことはありません。code.google.com/ p / json
Jason S

24
PHP json_encode()はデフォルトでスラッシュをエスケープしますが、JSON_UNESCAPED_SLASHESPHP 5.4.0(2012年3月)以降のオプションがあります
Walter Tross

6
ここだけでは、すべてのスラッシュをエスケープしませんPHPコードです'</'echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
rustyx

コードに「</」が含まれていますか、それともエコーから始まりますか?エコーから始めると失敗するからです。私は何も取得しません。はい、変数の$ objを置き換えました:)
marciokoko 2013

JSONは何もエスケープしたりシリアライズしたりしません... JSONシリアライザーはエスケープします。どちらを使用していますか?
軌道上での軽さのレース

回答:


284

JSONを使用する必要はありません。それを行うことができます。また、「A」に「\ u0061」を使用できますが、必須ではありません。\/JSONを<script>タグに埋め込む際に許可すると、</Sebが指摘するように、文字列の内部は許可されません。

Microsoftの一部のASP.NET Ajax / JSON APIは、この抜け穴を使用して追加情報を追加します。たとえば、日時はとして送信され"\/Date(milliseconds)\/"ます。(ヤック)


4
それは良いことです。とにかく、JSONは多くの場合、スクリプトタグに埋め込まれていません。
ルーベン、

8
ASP.NET JSON日付形式の根拠については、次のブログ投稿を参照してください:weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
Michiel van Oosterhout

25
JSONシリアライザーの特定の実装は、(完全に有効なJSONであるが)余分な文字があるJSONを出力するため、JSONを置き換える必要があります。これにより、JSスクリプトとしてHTMLスクリプト要素にドロップすることもできます。誰かが彼に水翼のセットを買ったので、それは赤ちゃんを浴槽で投げ出すほどではありません。
Quentin

15
私が得られないのは、JSONシリアライザーがJSONがどこに行き着くかさえ気にする理由です。Webページ上、HTTPリクエスト内など。必要な場合は、最終レンダラーが追加のエンコーディングを実行できるようにします。
Dan Ross

5
@DanRossそしてできます。JSONの使用を容易にするために、エスケープ/必須ではありません。許可されています。エスケープしたくない場合は、エスケープ/しないでください。
Andreas

35

JSON仕様では、スラッシュをエスケープできると記載されていますが、必須ではありません。


9
その特定のセクションへのリンクを追加できますか?
ライアンゲイツ

1
仕様はそれを述べていません。実際には、それはあなたが固相線文字をエスケープする必要があるということだけです。ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdfを
Ebert

10
@JoaEbert:逆の固相線はエスケープする必要がありますが、固相線をエスケープする必要はありません。セクション9には、「エスケープする必要のある文字を除くすべての文字を引用符で囲むことができます。引用符(U + 0022)、逆ソリダス(U + 005C)、および制御文字U + 0000からU + 001Fです。 」
ハロルドL

4
ハロルド、ありがとう!図5にも示されているとおり、「...を除くすべてのコードポイント」には/はオプションであると明記されています。
Joa Ebert、

15

私は尋ねた同じ質問をいくつかの時間前に、それを自分自身に答える必要がありました。これが私が思いついたものです:

JavaScriptのルーツに由来するという私の最初の考えは正しかったようです。

'\/' === '/'JavaScriptでは、JSON 有効なJavaScriptです。しかし、\zJSON では他の無視されたエスケープ(など)が許可されないのはなぜですか?

このための鍵は、http://www.cs.tut.fi/~jkorpela/www/revsol.htmlを読み、その後にhttp://www.w3.org/TR/html4/appendix/notes.html#hBを読むことでし た 。 .3.2。スラッシュエスケープの機能により、JSONをHTML(SGMLとして)およびXMLに埋め込むことができます。


5
構造化されたデータのペイロード配信メカニズムは、言語の構成要素に結び付けるべきではありません。これは将来変更される可能性があるためです...しかし、これは、JSONの作成者がいた場合の設計上の決定を説明する可能性があります。

'\ /' === '/'それで、jsonpを受け取ったときにスラッシュのエスケープを解除する必要はありませんか?
Timmetje 2013

8

PHPはデフォルトスラッシュをエスケープします。そのため、これが非常に一般的に表示されます。理由はわかりませんが"</script>"<script>タグ内に文字列を埋め込むことは安全ではないと考えられているためでしょう。

この機能はJSON_UNESCAPED_SLASHESフラグを渡すことで無効にできますが、元の結果はすでに有効なJSONであるため、ほとんどの開発者はこれを使用しません。


5

醜いPHP!

JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES...デフォルトではなく、(変な)オプションでなければならないのphp-開発者にそれを言うためにどのように?

デフォルトは UTF8として最も頻繁に使用し、(現在の)最も広く使われている規格でなければなりません。Githubまたは他の場所にあるPHPコードフラグメントには、この「エキゾチックなHTMLに埋め込まれた」機能がいくつ必要ですか?


2
そうだ!しかし、PHPは奇妙なエラーをすべて将来に向けて促進し、害虫のように世界中に広まった破損した歴史的なPHPスニペットのすべての以前の一般的なバグを壊さないようにします。したがって、PHPによって行われたこれらすべての誤った決定、つまりPHPに関するほとんどすべての決定が標準になります。標準の変更を期待することはできません。そのため、すべてのPHP開発者は、PHPで見つかった深刻なバグすべてに対する無数の回避策をすべて知って実装する必要があります。stackoverflow ..
Tino

あなたは完全に間違っています。それはJavaScriptによるものです。以下で指摘したように。JSでは'\/' === '/'trueを返します。事実を守ることをお勧めします。ほとんどの人は、いくつかの矛盾する関数名に対処できます。過去を見ることができないからといって、PHPが悪いツールになることはありません。
Cobolt

1
こんにちは@Cobolt、古い質問です。今日はPHPを使用していません...しかし、ディスカッションブログとして、コアは「デフォルトは最も頻繁に使用する必要がある」であるため、醜さはこの「最も頻繁に使用する」ことを無視することです(醜い)Javascriptの動作の。
Peter Krauss、

1
ここは特定の言語について怒鳴る場所ではありません。PHPが現在何をしているのか、そしてどのようにそれを無効にするのかを指摘することはより役立つでしょう、そしてそれを行う答えが追加されました
IMSoP
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.