gpt4 book ai didi

php - 防止 HTML 元素中的 XSS

转载 作者:行者123 更新时间:2023-12-04 00:45:12 25 4
gpt4 key购买 nike

以下是否足以防止 HTML 元素内部的 XSS?

function XSS_encode_html ( $str )
{
$str = str_replace ( '&', "&", $str );
$str = str_replace ( '<', "&lt;", $str );
$str = str_replace ( '>', "&gt;", $str );
$str = str_replace ( '"', " &quot;", $str );
$str = str_replace ( '\'', " &#x27;", $str );
$str = str_replace ( '/', "&#x2F;", $str );

return $str;
}

正如这里提到的:-
https://www.owasp.org/index.php/Abridged_XSS_Prevention_Cheat_Sheet#RULE_.231_-_HTML_Escape_Before_Inserting_Untrusted_Data_into_HTML_Element_Content


编辑

我没有使用 htmlspecialchars() 因为:-

  1. 它不会将/更改为 /
  2. '(单引号)在设置 ENT_QUOTES 时变为 '''(或 ')。

根据 OWASP,'(单引号)应该变成 '(叫我迂腐)并且,
' 不推荐,因为它不在 HTML 规范中


最佳答案

在元素的内容中,the only character that can be harmful is the start-tag delimiter < 因为它可能表示某些标记声明的开始,无论它是开始标记、结束标记还是注释。所以该字符应该总是被转义。

其他字符不一定需要在元素内容中进行转义。

引号只需要在标签内进行转义,特别是当用于包含在相同引号内或根本不被引号的属性值时。同样,标记声明结束分隔符 >只需要在标签内进行转义,此处仅当用于不带引号的属性值时。然而,escaping plain ampersands as well is recommended to avoid them being interpreted as start of a character reference by mistake .

现在至于替换/的原因同样,这可能是由于 SGML 中的一个特性,标记语言 HTML 改编自,这允许所谓的 null end-tag :

To see how null end-tags work in practice consider its use in conjunction with an element which can be defined as:

<!ELEMENT ISBN  - -  CDATA --ISBN number-- >

Instead of entering an ISBN number as:

<ISBN>0 201 17535 5</ISBN>

we can use the null end-tag option to enter the element in the shortened form:

<ISBN/0 201 17535 5/

但是,我从未见过任何浏览器实现过此功能。 HTML的语法规则一直比SGML的语法规则要严格。

另一个更可能的原因是所谓的 raw text elements ( script and style ) 的内容模型。 ,这是带有以下 restriction 的纯文本:

The text in raw text and RCDATA elements must not contain any occurrences of the string "</" (U+003C LESS-THAN SIGN, U+002F SOLIDUS) followed by characters that case-insensitively match the tag name of the element followed by one of "tab" (U+0009), "LF" (U+000A), "FF" (U+000C), "CR" (U+000D), U+0020 SPACE, ">" (U+003E), or "/" (U+002F).

这里表示在原始文本元素内部,例如 script出现</script/将表示结束标记:

<script>
alert(0</script/.exec("script").index)
</script>

虽然是完全有效的 JavaScript 代码,但结束标记将由 </script/ 表示.但除此之外,/不会受到任何伤害。如果你只允许在 JavaScript 上下文中使用转义 HTML 的任意输入,你就已经注定失败了。

顺便说一句,什么样的character reference并不重要这些字符被转义,无论是命名字符引用(即实体引用),还是数字字符引用,无论是十进制还是十六进制表示法。它们都引用相同的字符。

关于php - 防止 HTML 元素中的 XSS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16125244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com