17

私は車輪を再発明し、Java で独自の JSON 解析メソッドを作成しています。

私はjson.orgの (非常に素晴らしい!) ドキュメントを参照しています。私が確信していない唯一の部分は、「または制御文字」と書かれている場所です

ドキュメンテーションは非常に明確で、JSON は非常にシンプルで実装が簡単なので、ルーズではなく仕様を要求しようと思いました。

Javaで制御文字を正しく削除するにはどうすればよいですか? おそらくユニコードの範囲がありますか?

ここに画像の説明を入力


編集:(一般的に?)パズルに欠けているピース

タグで問題になる可能性がある、定義された範囲1 2以外の他の制御文字があると通知されました。 <script>

最も顕著なのは、改行として機能する文字 U+2028 および U+2029、行と段落の区切り文字です。文字列リテラルの途中に改行を挿入すると、ほとんどの場合、構文エラー (文字列リテラルが終了していない) が発生します。3

これは XSS の脅威にはならないと思いますが、<script>タグで使用するためのルールを追加することをお勧めします。

  • シンプルにして、すべての非「ASCII印刷可能」文字を\u表記法でエンコードしてください。それらのキャラクターは、そもそも珍しいものです。必要に応じて、ホワイト リストに追加することもできますが、ホワイト リストのアプローチをお勧めします。
  • 認識していない場合は、忘れないでください</script(大文字と小文字は区別されません)。これにより、ページにHTML スクリプトが挿入される可能性があります</script><script src=http://tinyurl.com/abcdef>。デフォルトでは、これらの文字はいずれも JSON でエンコードされていません。
4

4 に答える 4

8

Character.isISOControl(...)はできますか? ちなみに、UTF-16 は Unicode コードポイントのエンコーディングです... バイト レベルで操作する予定ですか、それとも文字/コードポイント レベルで操作する予定ですか? UTF-16 から Java のコア API への文字ストリームへのマッピングを残すことをお勧めします...

于 2011-05-18T22:04:57.010 に答える
6

あまり具体的ではありませんが、Unicode 仕様の「制御」文字カテゴリを参照していると思います。

Java ではc、次の式を使用して、文字が Unicode 制御文字であるかどうかを確認できますCharacter.getType(c) == Character.CONTROL

于 2011-05-18T22:04:42.580 に答える
4

制御文字の Unicode 定義は次のとおりだと思います。

U+0000..U+001F および U+007F..U+009F の範囲の 65 文字。

それが制御コードの定義ですが、上記の後に「制御文字としても知られている」という文が続きます。、 それで...

于 2011-05-18T22:06:09.080 に答える
4

数年前に質問されたことは知っていますが、受け入れられた回答が正しくないため、とにかく返信します。

Character.isISOControl(int codePoint) 

次のチェックを行います。

(codePoint >= 0x00 && codePoint <= 0x1F) || (codePoint >= 0x7F && codePoint <= 0x9F);

JSON 仕様はhttps://www.rfc-editor.org/rfc/rfc7159で定義されています。

  1. ストリングス

文字列の表現は、プログラミング言語の C ファミリーで使用される規則に似ています。文字列は引用符で始まり、引用符で終わります。すべての Unicode 文字を引用符で囲むことができます。ただし、エスケープする必要がある文字 (引用符、反転ソリッド、および制御文字 (U+0000 から U+001F)) を除きます。

Character.isISOControl(int codePoint) 

エスケープする必要のあるすべての文字にフラグを立てますが、エスケープする(U+0000-U+001F)必要のない文字にもフラグを立てます(U+007F-U+009F)。文字をエスケープする必要はありません(U+007F-U+009F)

于 2016-07-08T12:56:09.973 に答える