💨
【Go】不正なバイト列を代替文字に置き換える
2019年9月リリースの Go 1.13 で不正なバイト列を代替文字に置き換えるための ToValidUTF8
が追加された。Unicode では代替文字として U+FFFD
が定義されている。不正なバイト列を削除することは想定しない脆弱性を生み出す可能性があるので避けるべきである。
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println(strings.ToValidUTF8("あ\x80いう", "\uFFFD"))
fmt.Println(strings.ToValidUTF8("att\x80ack", ""))
}
Go 1.11 で導入された Map
関数も使える
package main
import (
"fmt"
"unicode/utf8"
"strings"
"bytes"
)
func main() {
scrub := func(r rune) rune {
if r == utf8.RuneError {
return 0xFFFD
}
return r
}
fmt.Println(strings.Map(scrub, "あい\x80う"))
fmt.Printf("%X \n", bytes.Map(scrub, []byte{ 0x80 }))
fmt.Printf("%X \n", bytes.Map(scrub, []byte("\uFFFD")))
}
不正なバイト列が含まれているかをチェックするための Valid
、ValidString
も定義されている
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
valid := []byte("あいう")
invalid := []byte{0xFF}
fmt.Println(utf8.Valid(valid))
fmt.Println(utf8.Valid(invalid))
fmt.Println(utf8.ValidString(string(valid)))
fmt.Println(utf8.ValidString(string(invalid)))
}
Discussion