缺少 JWT 签名检查¶
ID: go/missing-jwt-signature-check
Kind: path-problem
Security severity: 7.8
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-347
Query suites:
- go-code-scanning.qls
- go-security-extended.qls
- go-security-and-quality.qls
当未正确验证签名时,解码 JSON Web 令牌 (JWT) 的应用程序可能容易受到攻击。
建议¶
始终使用 JWT 库提供的适当方法来验证签名,或使用默认情况下验证签名的库。
示例¶
以下(错误)示例显示了在未验证签名的情况下解析 JWT 的情况。
package main
import (
"fmt"
"log"
"github.com/golang-jwt/jwt/v5"
)
type User struct{}
func decodeJwt(token string) {
// BAD: JWT is only decoded without signature verification
fmt.Println("only decoding JWT")
DecodedToken, _, err := jwt.NewParser().ParseUnverified(token, &User{})
if claims, ok := DecodedToken.Claims.(*User); ok {
fmt.Printf("DecodedToken:%v\n", claims)
} else {
log.Fatal("error", err)
}
}
以下(正确)示例使用适当的函数来解析 JWT 并验证其签名。
package main
import (
"fmt"
"log"
"github.com/golang-jwt/jwt/v5"
)
type User struct{}
func parseJwt(token string, jwtKey []byte) {
// GOOD: JWT is parsed with signature verification using jwtKey
DecodedToken, err := jwt.ParseWithClaims(token, &User{}, func(token *jwt.Token) (interface{}, error) {
return jwtKey, nil
})
if claims, ok := DecodedToken.Claims.(*User); ok && DecodedToken.Valid && !err {
fmt.Printf("DecodedToken:%v\n", claims)
} else {
log.Fatal(err)
}
}
参考¶
JWT IO:JSON Web 令牌简介。
jwt-go:文档。
Go JOSE:文档。
常见弱点枚举:CWE-347。