ホームページ > バックエンド開発 > Golang > 「GoのJSONマーシャリング中のエスケープ」を防ぐには?

「GoのJSONマーシャリング中のエスケープ」を防ぐには?

Linda Hamilton
リリース: 2024-12-21 10:33:14
オリジナル
376 人が閲覧しました

How to Prevent `` Escaping During JSON Marshaling in Go?

エンコーディングの障害の克服: < の抑制そして> json.Marshal でのエスケープ

はじめに

JSON 形式のデータを扱う場合、< などの特定の文字を保持する必要がある場合があります。 > はエンコードされた文字列の一部として使用されます。ただし、オブジェクトを JSON 文字列に変換するためのデフォルトの Go ライブラリ関数である json.Marshal は、潜在的なセキュリティ脆弱性を防ぐためにこれらの文字を自動的にエスケープします。データにこれらの文字に依存する HTML または XML コードが含まれている場合、これは問題となる可能性があります。

問題

次のコード スニペットでは、XmlRequest フィールドに HTML-コンテンツと同様ですが、json.Marshal エンコード後、<そして>文字はエスケープされます:

package main

import (
    "encoding/json"
    "fmt"
)

type Track struct {
    XmlRequest string `json:"xmlRequest"`
}

func main() {
    track := new(Track)
    track.XmlRequest = "<car><mirror>XML</mirror></car>"
    trackJSON, _ := json.Marshal(track)
    fmt.Println("After Marshal:", string(trackJSON))
}</p>
<p>結果の JSON 文字列は次のとおりです:</p>
<pre class="brush:php;toolbar:false">{"xmlRequest":"\u003ccar\u003e\u003cmirror\u003eXML\u003c/mirror\u003e\u003c/car\u003e"}
ログイン後にコピー

ただし、必要な JSON 文字列は次のようになります:

{"xmlRequest":"<car><mirror>XML</mirror></car>"}
ログイン後にコピー

解決策

Go 1.7 の時点では、組み込みメカニズムはありませんjson.Marshal 内でエスケープを無効にします。ただし、回避策は、エスケープ動作を明示的に制御するカスタム関数を作成することです。

func (t *Track) JSON() ([]byte, error) {
    buffer := new(bytes.Buffer)
    encoder := json.NewEncoder(buffer)
    encoder.SetEscapeHTML(false)
    if err := encoder.Encode(t); err != nil {
        return nil, err
    }
    return buffer.Bytes(), nil
}
ログイン後にコピー

このカスタム JSON() メソッドでは、エンコーダーの SetEscapeHTML フラグが false に設定され、HTML 文字のエスケープが無効になります。 json.Marshal の代わりにこのメソッドを呼び出すことで、元のコンテンツをエスケープせずに保存できます。

trackJSON, err := track.JSON()
ログイン後にコピー

あるいは、任意のインターフェース{}を入力として受け取る関数を作成することで、より一般的なソリューションを実装できます。

func JSONMarshal(v interface{}) ([]byte, error) {
    buffer := new(bytes.Buffer)
    encoder := json.NewEncoder(buffer)
    encoder.SetEscapeHTML(false)
    if err := encoder.Encode(v); err != nil {
        return nil, err
    }
    return buffer.Bytes(), nil
}
ログイン後にコピー

以上が「GoのJSONマーシャリング中のエスケープ」を防ぐには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート