설명
큰 정수 값을 작은 정수 타입으로 바로 변환하면 값이 잘리거나 랩어라운드될 수 있습니다. 보안 관련 크기나 권한 값에 사용되면 검증 우회가 발생할 수 있습니다.
잠재적 영향
- 제한 값이나 식별자가 의도하지 않은 값으로 변환될 수 있습니다.
- 서비스 거부 또는 권한 검증 오류로 이어질 수 있습니다.
해결 방법
- 필요한 비트 크기로
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는 범위 초과 시 경계값과 오류를 함께 반환하므로 오류를 무시하면 안 됩니다.