エンコーディングの障害の克服: < の抑制そして> 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 サイトの他の関連記事を参照してください。