인코딩 장애 극복: < > 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)) }
결과 JSON 문자열은 다음과 같습니다.
{"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 중국어 웹사이트의 기타 관련 기사를 참조하세요!