如何将POST后的字符串验证为有效的UTF-8(在C中)?

时间:2012-10-15 17:36:25

标签: c utf-8 http-post

我们有一个CGI程序,用于处理POST-ed表单。一些POST文本可以包含非ASCII字符 - 浏览器已经有助于将这些字符转换为UTF-8。

我需要“强化”程序以拒绝无效字符串 - 其中非ASCII字符串也不是有效的UTF-8字符串。

我想,我依赖于mbstowcs():

setlocale(LC_CTYPE, "en_US.UTF-8");
unilen = mbstowcs(NULL, foo, 0);
if (unilen == (size_t)-1) {
    ... report an error ...
}

但是,我很难验证该方法 - 它接受有效的字符串,但是我无法想出一个无效的来拒绝...

请有人确认,这是一种正确的方式和/或建议替代方案吗?

注意,我不关心转换的实际结果 - 一旦我确信,字符串是有效的UTF-8,我将其复制到电子邮件中(使用UTF-8字符集)并让收件人的电子邮件程序处理它。我打扰验证的唯一原因是确保表单不会用于传播任意二进制文件(例如病毒)。

谢谢!

1 个答案:

答案 0 :(得分:0)

功能文档说

“如果遇到无效的多字节字符,则返回(size_t)-1值。”

所以我相信你的验证非常好。就个人而言,我总是发现这个值因无效数据而被破坏。您可以提交一个偶数长度的任意十六进制序列来确定。

如果您怀疑并需要进一步验证,gnu iconv是一个很好的替代

utf-8 validation on SO