Golang Web应用程序安全性:你应该检查输入是否是有效的utf-8吗?

rks48beu  于 2023-04-27  发布在  Go
关注(0)|答案(1)|浏览(174)

根据几个最佳实践文档,检查输入数据是否为UTF-8是一个好主意。
在我的项目中,我使用Gin和go-playground/validator进行验证。有一个“ascii”验证器,但没有“utf-8”验证器。
我找到了https://pkg.go.dev/unicode/utf8#ValidString,我想知道用它来检查输入是否有帮助,因为Go本身在内部使用Unicode?
下面是一个例子:

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

type User struct {
    Name string `json:"name" binding:"required,alphanum"`
}

func main() {
    r := gin.Default()
    r.POST("/user", createUserHandler)
    r.Run()
}

func createUserHandler(c *gin.Context) {
    var newUser User
    err := c.ShouldBindJSON(&newUser)

    if err != nil {
        c.AbortWithError(http.StatusBadRequest, err)
        return
    }

    c.Status(http.StatusCreated)
}

是否确保在调用c.ShouldBindJson后,newUser中的名称是UTF-8编码的?使用utf8.ValidString检查name是否有任何优势?

kr98yfug

kr98yfug1#

Gin使用标准的encoding/json包来解组JSON文档。该包的文档如下:
在对带引号的字符串进行解封时,无效的UTF-8或无效的UTF-16代理项对不会被视为错误。相反,它们会被Unicode替换字符U+FFFD替换。
确保解码的字符串值是有效的UTF-8。使用utf8.ValidString检查字符串值没有任何优势。
根据应用程序的要求,您可能需要检查并处理Unicode替换字符“�"。正如这个答案中的所展示的,SO像处理任何其他字符一样处理Unicode替换字符。
Go本身在内部使用Unicode?
一些语言特性使用UTF-8编码(字符串上的范围,[]rune和字符串之间的转换),但这些特性不限制可以存储在字符串中的字节。字符串可以包含任何字节序列,包括无效的UTF-8。

相关问题