我知道如何解析golang中的发布数据

r.ParseForm()
pid := r.PostFormValue("pid")
code := r.PostFormValue("code")
lang := r.PostFormValue("lang")
author := r.PostFormValue("author")

但是发布数据是pid=1&code=#include <stdio.h>\x0Aint main()\x0A{\x0A\x09printf(\x223\x5Cn\x22);\x0A\x09return 0;\x0A}&lang=c&author=11(这是从nginx日志中获得的)

因此,当我解析数据时,可能是错误的。 code的解析数据为
#include <stdio.h>
int main()
{
    printf("3\n")

代替
#include <stdio.h>
int main()
{
    printf("3\n");
    return 0;
}

那我该如何解决这个问题呢?

最佳答案

您正在传递原始代码,这可能是不安全,您的问题是由于以下原因:

https://golang.org/src/net/url/url.go?s=21047:21092#L761

c - 在golang中解析带有标点符号的发布数据不正确-LMLPHP

我建议您对日志代码进行base64编码,然后在处理程序中对其进行解码。

import "encoding/base64"

...

code, err := base64.RawURLEncoding.DecodeString(r.PostFormValue("code"))
    if err != nil {
        // handle error
    }

然后您的请求应如下所示:
curl --data "pid=1&code=I2luY2x1ZGUgPHN0ZGlvLmg-XHgwQWludCBtYWluKClceDBBe1x4MEFceDA5cHJpbnRmKFx4MjIzXHg1Q25ceDIyKTtceDBBXHgwOXJldHVybiAwO1x4MEF9&lang=c&author=11" http://localhost:8080

09-26 09:02