2017-05-26 115 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

太好了!這對我有效 –