如何强制XMLHttpRequest仅使用ISO-8859-1字符集?

3

我有一个ISO-8859-1编码的数据库,因此我希望完全使用这种编码来交换请求。那么,如何正确设置AJAX请求的content-type?


3
这正是错误的做法,你正在信任客户端以特定编码发送数据,但实际上他们可以向你的服务器发送任意数据。一款强大的服务器将检查编码的有效性并进行转换或拒绝。 - Esailija
1
还有,编码与未经检查发送到服务器的数据有什么关系?! - Thevs
3
请停止谈论SQL注入和(可能的)PHP。我使用非SQL数据库,也不使用PHP。我的问题与输入数据的净化无关。 - Thevs
3
什么样的人啊!?我知道所有这些问题,但我问了完全不同的问题。 - Thevs
2
这是旧的内容,但对于任何偶然发现它的人,请使用XMLHttpRequest对象的*.overrideMimeType('text/plain; charset=ISO-8859-1');*方法,该方法来自MDN使用XMLHttpRequest - Nikos M.
显示剩余10条评论
3个回答

4
即使这样做是不好的(上面有一堆评论),但以下方法可以解决问题:
var xhr = new XMLHttpRequest(); 
xhr.open("GET", path, false);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=ISO-8859-1')

如果您正在使用jQuery:https://dev59.com/PnRB5IYBdhLWcg3wro6B#553572

糟糕,打错字了,现在已经修复。 - Hieu Nguyen
“charset”参数对于此内容类型是非法的,有些服务器甚至会拒绝请求,因为它们被视为格式不正确。在这种内容类型中,有效的内容仅使用ASCII,因此指定“charset”参数没有任何意义。 - Esailija
不建议在application/<something>中发送字符集。许多API不接受在“Content-type”头中设置多个参数。 - Krasimir

1
根据W3C XMLHttpRequest.send() 的规范,字符集在大多数情况下将会是UTF-8,这取决于data的值。即使您指定任何字符集编码,也可能会被覆盖为UTF-8:

如果Content-Type头部在作者请求头中,并且其值是具有字符集参数的有效MIME类型,而该参数的值与encoding不区分大小写,则将该Content-Type头部的所有字符集参数设置为encoding

用户代理可以确定编码方式:将包含AJAX的页面编码设置为ISO-8859-1。然后,UA将假定所有表单提交使用ISO(除非表单另外指定了不同的编码),并且根据对W3C算法的解释,可能会进行AJAX提交。

最终,唯一可靠的解决方案是将访问者所见的页面(其中包含 AJAX)设置为 ISO-8859-1,然后确保在后端检查并转换为 ISO(无论如何,您都需要对发送到数据库之前的所有用户输入进行净化,因此只需将此转换添加到该过程中)。PHP或您使用的语言中有很多库函数可以执行此操作。否则,无法保证符合规范,因此请务必检查/确保后端编码。


这个答案对我没有帮助。我的页面设置为ISO-8859-1,但是所有的AJAX请求都使用UTF-8。 - Thevs
我不需要进行消毒。句号。 - Thevs

0

我认为我需要解释编码和字符集参数。这些涉及如何解码通过网络发送的原始字节。

例如,考虑内容类型application/x-www-form-urlencoded和以下数据:

0x61253344254345254232

由于没有字符集(实际上,字符集是此内容类型的非法参数...)必须假定为ISO-8859-1。因此,使用ISO-8859-1对上述内容进行解码的结果如下:

"a%3D%CE%B2"

现在有另一种格式需要解码(表单urlencoded),它有自己的规则。根据当前规范,这里的百分号编码必须是UTF-8,因此在进行字符串 -> 字符串转换后,您将得到上述结果:
"a"

正如您所看到的,该格式从未使用ASCII以外的字符,因此字符集并不重要,也不受支持。


你实际的问题与百分号编码使用的编码方式无关。即使你定义了一个自定义函数来使用ISO-8859-1进行百分号编码,服务器在接收到数据后仍然需要对其进行解码并为数据库进行编码。你从中得不到任何好处。


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