説明
大きな整数を小さい整数型へ直接変換すると、値が切り詰められたり折り返したりすることがあります。その値をセキュリティ上重要なサイズや権限の判断に使うと、検証を回避されるおそれがあります。
想定される影響
- 制限値や識別子が意図しない値へ変わる可能性があります。
- サービス拒否や認可の誤りにつながるおそれがあります。
対処方法
- 必要なビット数を指定して
strconv.ParseIntまたはstrconv.ParseUintを呼び出し、エラーを確認してください。 - 変換前に上限と下限を明示的に検査してください。
例
変更前
go
n, _ := strconv.ParseInt(value, 10, 64)
small := int32(n)
変更後
エラーを返す関数内の抜粋です。
go
n, err := strconv.ParseInt(value, 10, 32)
if err != nil {
return err
}
small := int32(n)
説明:
- 変更前: 大きい整数型として解析した値を小さい型へ変換すると、切り詰めや折り返しが発生する可能性があります。
- 変更後: 32 ビットの範囲で解析し、エラーがあれば値を使いません。
ParseIntは範囲外の入力に境界値とエラーを返すため、エラーを無視してはいけません。