文章讨论了HTTP响应中的字符编码(charset)问题,特别是Content-Type头中charset属性的缺失或错误可能导致跨站脚本(XSS)漏洞。文章详细解释了字符编码的重要性,浏览器如何处理HTTP响应的字符编码,以及攻击者如何利用字符编码的不确定性来注入恶意JavaScript代码。
字符编码定义了字符与字节之间的映射关系。浏览器需要知道服务器使用的字符编码,以便正确解码HTTP响应体中的字节。如果Content-Type头中缺少charset属性,可能导致浏览器错误地解析HTML文档。
当Content-Type头中没有charset属性时,浏览器会尝试从HTML文档中的<meta>标签或字节顺序标记(BOM)中获取字符编码信息。如果这些信息都缺失,浏览器会使用自动检测机制来猜测字符编码。
攻击者可以利用字符编码的不确定性,通过特定的字符编码(如ISO-2022-JP)来绕过安全检查,注入恶意JavaScript代码。他们可以使用否定反斜杠转义和打破HTML上下文两种技术来实现。
缺少charset属性或错误的字符编码设置可能导致严重的XSS漏洞。开发者在编写和部署代码时,应始终确保正确设置charset属性,以防止潜在的安全漏洞。随着浏览器和Web标准的进一步发展,字符编码的处理可能会变得更加严格。
作者:@Stefan Schiller
原文:https://thenewstack.io/encoding-differentials-why-charset-matters/
背景
关于 HTTP 响应中的字符编码(charset)的问题引起了广泛关注。具体来说,一个常见的 HTTP 响应示例中,
Content-Type
头缺少了
charset
属性,这可能导致跨站脚本(XSS)漏洞。
可能存在跨站脚本的漏洞风险,如下:
HTTP/1.1 200 OK
Server: Some Server
Content-Type: text/html
Content-Length: 1337
DOCTYPE html>
<html>
<head><title>Some Pagetitle>head>
<body>
…
有一个小瑕疵:头部缺少 charset 属性。charset 是一组计算机可以用来表示文本的字符集。这听起来可能不是大问题,但攻击者可以轻易利用这一点,通过有意改变浏览器假设的字符集来注入任意的 JavaScript 代码到网站中。
要点
Content-Type
头中的
charset
属性缺失或不正确,可能导致浏览器在解析 HTML 文档时使用错误的字符编码,从而为攻击者提供注入恶意 JavaScript 代码的机会。
【第3335期】XSS终结者-CSP理论与实践
分析
字符编码的重要性
浏览器的行为