提交表单中允许的字符(包括UTF-8)

liv*_*cmg 3 ascii utf-8

假设我允许我的用户提交包含一些文本字段的表单(我不是在谈论密码).我的用户偶尔会使用非ASCII字符,如俄语,中文等,所以我在我的数据库中使用UTF-8字符集.问题是,我是否应该真正允许所有可能的UTF-8字符?我查看了ASCII表,看到字符0到31与文本无关,除了换行符和空格.字符176到223似乎是出于装饰目的:p.我应该限制它们吗?

Gum*_*mbo 6

W3C在多语言表单编码的示例正则表达式中跳过这些字符:

$field =~
  m/\A(
     [\x09\x0A\x0D\x20-\x7E]            # ASCII
   | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
   |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
   | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
   |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
   |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
   | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
   |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
  )*\z/x;
Run Code Online (Sandbox Code Playgroud)


tho*_*ter 5

确保它是有效的UTF-8和Unicode?

确保它不包含某些字符,例如控制代码? 可能没有必要

您应该注意,即使您在表单中使用UTF-8,当所有用户代理向您发送表单数据时,它们也可能无法从所有用户代理中获得有效的UTF-8,因此您将必须对其进行过滤。无效的UTF-8可以采用多种形式,其中一些形式是

  • 编码过长(可能导致安全问题)
  • 其他无效的UTF-8字节序列,可能表示用户代理忽略了字符编码,而是提交了类似Windows-1252或ISO-8859-1的编码。
  • Unicode保留的代理空间中的代码点

在输入过程中,需要过滤掉上述所有内容,否则您将无法存储有效的Unicode。

如果要提供使用Unicode子集的有效HTML或XHTML,则还需要过滤掉(在输入或输出处):

  • C0控制代码0x00至0x19(除了制表符,空格,换行和回车符)
  • 0x7F
  • C1控制码0x80至0xBF
  • (可能)高于0x10FFFF的任何代码点