客户端浏览器正在发送标头HTTP_ACCEPT_CHARSET: ISO-8859-1,utf-8;q=0.7,*;q=0.3
。我只使用正确的标题以utf8的形式提供网页,但浏览器会使用ISO-8859-1字符集编码的表单发布数据。我的问题是,浏览器是否总是按照其ACCEPT_CHARSET标头的顺序选择字符集,这样我就可以可靠地编写一个中间件,它将使用第一个条目解码任何发布的数据,在本例中为ISO-8859-1,并将其编码为utf8。
更新
我使用accept-charset="utf-8"
更新了表单标记,但我仍然看到非unicode字符出现。用户是否可能从其他地方(lastpass,excel文件)复制/粘贴密码可能会注入非unicode字符?
答案 0 :(得分:2)
请求标头Accept-Charset
(可能映射到HTTP_ACCEPT_CHARSET
服务器端)表示客户端的首选项,当服务器能够以不同的编码服务资源时使用。服务器可能会忽略它,而且经常会忽略它。
如果您的页面采用UTF-8编码并声明为此类页面,那么除非您指定accept-charset
属性,否则页面上的任何表单都会将其数据发送为UTF-8编码。因此,如果浏览器将数据发布为ISO-8859-1编码,则这是一个浏览器错误。但是,在得出结论之前需要对此进行分析。
有一种ald技术,包括一些特殊字符,使用安全字符参考编写,作为隐藏字段的值。然后,服务器端处理程序可以获取此字段的值并检测编码不匹配,甚至可以启发式地从特殊字符的编码形式推断出实际编码。
答案 1 :(得分:0)
我不确定所有浏览器是否总是按照相同的特定顺序选择字符集,但您可以在表单中设置accept-charset,这会强制浏览器发送utf-8编码数据。
像这样:
<form accept-charset="utf-8"></form>