2017-05-26 117 views
0

我正在使用Golang构建API Rest。我有一个包含很多字段(超过100个)的结构,因此我使用gorilla/schema将来自客户端的值分配给结构,该结构工作得很好。在Golang中实现XSS保护

现在,我想避免用户在任何字符串字段中插入Javascript代码,在结构中我定义了bool,strings,byte []和int值。所以,现在我想知道验证的最好方法是什么。

我在interate在结构只有在字符串领域的思考和做出类似:

Loop over the struct { 
    myProperty := JSEscapeString(myProperty) 
} 

是否确定?在这种情况下,我怎么能遍历结构,但只有字符串字段?

回答

0

您可以使用反射来遍历字段并转义字符串字段。 例如:

myStruct := struct { 
     IntField int 
     StringField string 
    } { 
     IntField: 42, 
     StringField: "<script>alert('foo');</script>", 
    } 

    value := reflect.ValueOf(&myStruct).Elem() 

    // loop over the struct 
    for i := 0; i < value.NumField(); i++ { 
     field := value.Field(i) 

     // check if the field is a string 
     if field.Type() != reflect.TypeOf("") { 
      continue 
     } 

     str := field.Interface().(string) 
     // set field to escaped version of the string 
     field.SetString(html.EscapeString(str)) 
    } 

    fmt.Printf("%#v", myStruct) 
    // prints: struct { IntField int; StringField string }{IntField:42, StringField:"&lt;script&gt;alert(&#39;foo&#39;);&lt;/script&gt;"} 

注意,有一个在html包的EscapeString功能。不需要实现你自己的。

+0

太好了!这对我有效 –