【问题标题】:How to force XMLHttpRequest to use ISO-8859-1 charset only?如何强制 XMLHttpRequest 仅使用 ISO-8859-1 字符集?
【发布时间】:2012-08-08 01:33:38
【问题描述】:

我有 ISO-8859-1 数据库,所以我喜欢完全在这个代码页中交换请求。那么,如何正确设置 AJAX 请求的 content-type 呢?

【问题讨论】:

  • How to change ajax-charset? 的可能重复项
  • @Thevs 这完全是错误的方式,您相信客户端以某种编码发送数据,但他们实际上可以向您的服务器发送任意数据。强大的服务器将检查编码的有效性并进行转换或拒绝。
  • 另外,编码与未经检查发送到服务器的数据有什么关系?!
  • 请停止谈论 SQL 注入和(可能)PHP。我有非 SQL 数据库,不使用 PHP。我的问题不在于清理输入。
  • 什么人!?我知道所有这些问题,但我提出了完全不同的问题。

标签: javascript ajax encoding


【解决方案1】:

即使这样做很糟糕(上面的一堆 cmets),这也可以:

var xhr = new XMLHttpRequest(); 
xhr.open("GET", path, false);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=ISO-8859-1')

如果你使用 jQuery:https://stackoverflow.com/a/553572/2527433

【讨论】:

  • 糟糕,错字,现已修正。
  • charset 参数对于这种内容类型是非法的,一些服务器甚至拒绝请求格式错误。这也没有任何意义,因为此内容类型中的有效内容仅使用 ASCII。
  • 不建议将字符集与 application/ 一起发送。许多 API 不接受 Content-type 标头中的多个设置。
【解决方案2】:

根据XMLHttpRequest.send() 的 W3C 规范,根据 data 的值,字符集在几乎所有情况下最终都将是 UTF-8。甚至您指定的任何字符集编码都可能会被 UTF-8 覆盖:

如果 Content-Type 标头在作者请求标头中,并且它的值是一个有效的 MIME 类型,该类型具有一个字符集参数,其值不是不区分大小写的 encoding 匹配,并且 encoding 不为空,将该 Content-Type 标头的所有字符集参数设置为 encoding

用户代理有一定的回旋余地来确定编码:将包含 AJAX 的页面的编码设置为 ISO-8859-1。然后,UA 将为所有表单提交(除非表单另外指定不同的编码)和可能的 AJAX 提交假定 ISO,具体取决于 W3C 算法的解释。

最终,唯一可靠的解决方案是将访问者看到的页面(上面带有 AJAX)设置为 ISO-8859-1,然后确保检查它并在后端转换为 ISO(您 无论如何都需要在将所有用户输入发送到数据库之前对其进行清理,因此只需将此转换添加到流程中)。在 PHP 或您给定的语言中有很多库函数可以做到这一点。否则无法保证符合规范,因此请绝对检查/确保后端的编码。

【讨论】:

  • 这个答案对我没有帮助。我的页面设置为 ISO-8859-1,但无论如何,所有 AJAX 请求都使用 UTF-8。
  • 我不需要消毒。点。
【解决方案3】:

我想我需要解释一下编码和字符集参数。这些关注原始字节如何 通过网络发送的应该被解码。

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

0x61253344254345254232

因为没有字符集(事实上,字符集是这种内容类型的非法参数...)ISO-8859-1 必须假设。所以在 ISO-8859-1 结果中解码上述内容:

"a%3D%CE%B2"

现在有另一种格式要解码(格式 urlencoded),它有自己的规则。 The current specs say that the percent encoding here must be UTF-8,所以在进行 string -> string 转换之后,你会得到 从上面:

"a=ß"

如您所见,格式从不使用 ASCII 以外的字符,因此字符集并不重要,并且 反正不支持。


您的实际问题与百分比编码使用的编码无关。即使您定义了百分比编码的自定义函数 在 ISO-8859-1 中,服务器仍然必须在到达时对其进行解码并对其进行编码以供数据库使用。你有 没有任何收获。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-13
    • 2013-01-19
    • 2012-09-29
    • 2012-09-23
    • 2016-11-26
    • 2012-09-01
    • 2015-08-25
    • 1970-01-01
    相关资源
    最近更新 更多