MB_ERR_INVALID_CHARS标志是否应该在与MultiByteToWideChar的UTF-8转换中使用?

时间:2014-04-02 22:45:04

标签: winapi unicode utf-8

使用Win32 API MultiByteToWideChar()进行从Unicode UTF-8到Unicode UTF-16的转换时,是否应使用 MB_ERR_INVALID_CHARS标记

换句话说,如果UTF-8输入无效,这是最好的行为,为什么?

  1. MultiByteToWideChar()来电失败(使用MB_ERR_INVALID_CHARS标志)
  2. 只需使用REPLACEMENT CHARACTER U+FFFD
  3. 替换无效的输入UTF-8字符

1 个答案:

答案 0 :(得分:2)

从UTF-8转换为UTF-16时使用MB_ERR_INVALID_CHARS似乎是从安全角度来看最好的做法,特别是与{{{ 3}}(如“Unicode技术报告#36:UNICODE SECURITY CONSIDERATIONS”中所述):

  

3.1.1形成错误的子序列

     

假设UTF-8转换器正在迭代输入UTF-8字节,转换为输出字符编码。如果转换器遇到格式错误的UTF-8序列,它可以通过多种不同方式将其视为错误,包括替换U + FFFD,SUB,“?”或SPACE等字符。但是,它不能使用任何有效的后继字节。例如,假设我们有以下顺序:

     

X =< ... 41 C2 3E 42 ...>

     

这个序列总体上是不正确的,因为它包含一个格式错误的子串,即< C2 > [...]

     

UTF-8转换器可以在C2字节处停止,或者替换像U + FFFD这样的字符或序列并继续。但是,如果继续,它不能消耗3E字节。 [...]

     

使用后续字节(例如 3E )不仅不符合; 可能导致安全漏洞。 [...]

事实上,使用MB_ERR_INVALID_CHARS标志会导致MultiByteToWideChar() API 失败存在无效的UTF-8序列,因此后续代码不存在风险(例如,调用代码)可能消耗无效子字符串之后的字节。