屏蔽敏感的URL查询参数

时间:2018-10-24 08:38:20

标签: url go

说我有这个网址

https://example.com:8080?private-token=foo&authenticity_token=bar

我有一个函数来确定是否要掩盖参数。

如何屏蔽网址,但保持参数顺序。

目前我有

u, err := url.Parse(originalURL)
if err != nil {
    panic(err)
}
m, _ := url.ParseQuery(u.RawQuery)
for key := range m {
    if toMask(key) {
        m.Set(key, "FILTERED")
    }
}
u.RawQuery = m.Encode()
return u.String()

但是这会返回带有已切换参数的网址。

https://example.com:8080?authenticity_token=FILTERED&private-token=FILTERED

1 个答案:

答案 0 :(得分:2)

首先,参数的顺序不重要。

但是我可以看到某些情况下该规则不适用(例如,当您对URL进行哈希处理时)。在这种情况下,您应该在使用URL之前对其进行标准化。

最后要回答您的问题,如果使用“查询”,则不能保留顺序,因为“值”是一个映射,并且映射不会打扰排序。因此,您应该使用u.RawQuery处理查询。

u, err := url.Parse(originalURL)
if err != nil {
    panic(err)
}
newQuery := ""
for i, queryPart := range strings.Split(u.RawQuery, ";") {
    // you now have a slice of string ["private-token=foo", "authenticity_token=bar"]
    splitParam :=  strings.Split(queryPart, "=")
    if toMask(splitParam[0]) {
        splitParam[1] = "FILTERED"
    }
    if i != 0 {
        newQuery = newQuery + ";"
    }
    newQuery = splitParam[0] + "=" + splitParam[1]
}
u.RawQuery = newQuery
return u.String()

此代码仅是示例。您必须更好地检查特殊情况或错误。如果需要,还可以使用regexp。