Golang struct unmarshal xss

У меня есть структура, в которую вставлен XSS. Чтобы удалить его, я json.Marshal, а затем запустить json.HTMLEscape. Затем я расскажу об этом в новую структуру.

Проблема в том, что в новой структуре XSS по-прежнему введен.

Я просто не могу понять, как удалить XSS из структуры. Я могу написать функцию, чтобы сделать это на поле, но, учитывая, что есть json.HTMLEscape, и мы можем восстановить его обратно, он должен работать нормально, но это не так.

type Person struct {
    Name string `json:"name"`
}
func main() {
    var p, p2 Person
     // p.Name has XSS
    p.Name = "<script>alert(1)</script>"
    var tBytes bytes.Buffer

    // I marshal it so I can use json.HTMLEscape
    marshalledJson, _ := json.Marshal(p)
    json.HTMLEscape(&tBytes, marshalledJson)

    // here I insert it into a new struct, sadly the p2 struct has the XSS still 
    err := json.Unmarshal(tBytes.Bytes(), &p2)
    if err != nil {
        fmt.Printf(err.Error())
    }
    fmt.Print(p2)

} 

ожидаемый результат - p2.Name, который будет очищен как &lt;script&gt;alert(1)&lt;/script&gt;

1 ответ

Первый, json.HTMLEscape не делает то, что вы хотите:

HTMLEscape добавляет к кодировке JSON src с символами <,>, &, U+2028 и U+2029 внутри строковых литералов, измененными на \u003c, \u003e, \u0026, \u2028, \u2029, так что JSON будет безопасным встроить в теги HTML