💨

【Go】不正なバイト列を代替文字に置き換える

2024/05/24に公開

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")))
}

不正なバイト列が含まれているかをチェックするための ValidValidString も定義されている

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