我能否强制网络浏览器将表单文本发送为UTF8?

15
我希望在我们的网站上推广UTF8标准。 我们所有的数据库和互联网内容都是UTF8格式。 所有我们的web服务器都会发送 charset=utf-8 的HTTP头。但我发现,通过在Firefox中更改编码(查看->字符编码)到其他编码,我可以在表单中输入拉丁9字符,并且PHP将把它们视为格式不正确的UTF8编码。 我需要担心这个问题吗?用户的Web浏览器是否可能覆盖UTF8字符集标头并发送非UTF8编码?
更新:有几个人建议在每个表单中使用accept-charset。 但是,我不想更改每个Web表单。 假设我可以控制HTTP内容类型标头,并将其设置为UTF8,我还需要担心什么吗?

我们所有的数据库和互联网资料 - 你所有的互联网资料都属于我们。 - Paul D. Waite
根据这个问题的被接受的答案,accept-charset将解决您发现的特定问题:即使用户告诉他们的浏览器将页面解释为非UTF-8,accept-charset也应该使浏览器提交表单内容作为UTF-8。是否值得将属性添加到所有表单以防范特定情况,那就取决于您的判断。 - Paul D. Waite
1
请确保您的页面真正采用UTF-8编码;在浏览器调试器中查找发送的Content-Type标头。此外,在JS控制台中,评估document.charset; 应该返回utf8的某些拼写形式。如果出现“windows-1252”,则可能意味着浏览器无法识别所发送的编码。 - OsamaBinLogin
4个回答

12

用户的Web浏览器是否可以覆盖utf8字符集标头并发送非UTF8编码?

当然可以。您无法控制客户端,客户端可以做任何它想做的事情,包括允许用户覆盖正常编码并引起垃圾(或通过垃圾传递)发送到您的服务器。

话虽如此,听起来您已经采取了大部分重要步骤。您的实际HTML文档是UTF-8编码并明确标记为此,这意味着浏览器通常会默认以该编码提交表单。(请注意,HTML规范不要求这样做。在表单上显式指定accept-charset是唯一的符合规范的保证。)我认为这将在所有现代浏览器中按预期工作,并且您可以轻松测试。

在服务器上,您的工作始终是验证输入,以达到对您的服务至关重要的程度。尽管绝大多数用户都是善良的并使用现代标准浏览器,但HTTP协议是开放的,疯狂的用户和恶意黑客都在那里,两者都可以向您投掷任何他们想要的数据。确保在涉及安全或身份验证数据时,您不会对数据编码做出任何假设,并在将其推入数据库之前对其进行清理。


4
我认为最好的解决方案是将数据转换为UTF-8,并在用户提交数据时处理任何非UTF-8字符。如上所述,accept-charset="UTF-8"不能保证数据是UTF-8。而且,如果你必须更改站点上的所有表单,那这不是一个好的解决方案。

因此,在提交时处理输入可能是更好的方式。


3

2
在表单元素上添加 accept-charset="UTF-8" 属性,这将导致表单提交采用 UTF-8 编码,而不受页面内容编码的影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接