去掉 < 和 > 字符是防止 XSS 的有效方法吗?

信息安全 Web应用程序 xss
2021-08-17 07:55:45

我猜想对输入进行 HTML 编码可能是一个更好的解决方案,但我很好奇只是去掉任何字符<>字符是否可以有效防御 XSS 攻击。

这样做会让网站免受 XSS 攻击吗?

更新:如果它不能保护我,有人可以解释什么类型的攻击可以通过吗?

3个回答

这取决于注入发生的上下文。

显然,如果注入发生在这样一个元素内容的上下文中:

<p>Your search for "❌" has returned the following results:</p>

<需要从文本切换到标记。但即使在这里,如果您在 a 中回显用户输入<script>,例如:

<script>var search = "❌";</script>

您需要寻找其他字符,因为您不在纯文本上下文中。在这里,您应该注意 JavaScript 字符串文字中的特殊字符以及可以表示script 元素结束标记的某些序列,例如</script></script/

同样,如果您在元素的属性值中打印用户输入:

<input type="text" name="search" value="❌">

在这里,您必须注意双引号属性值的特殊字符,即分隔"引号。如果您使用单引号或根本不使用引号,则需要应用不同的规则。

除此之外,您不仅需要查找语法,还需要查找语义。就像可以用于 XSS 的 URIjavascript:一样。data:或者有一个 JavaScript 使用部分用户提供的数据进行一些评估,或者检索一些额外的脚本代码等。有数百个示例

因此,请始终考虑您要放置用户提供的数据并相应地对该数据进行编码的上下文。

简短的回答:没有。

长答案:在很多情况下,是的,但不要这样做。

如果我在这里有任何错误,请有人纠正我。

如果且仅当文本仅输出到标准样式元素的“主体”,并且如果该主体没有被某些 Javascript 或其他方式抓取,那么老实说,我不得不说是。正文是指文本以形式输出<b><u>$USERINPUT</u></b>它是 HTML 文档中的文本,在某种程度上还不是标记的一部分。所以它不在某个标签或特殊块内。

但是,很多时候这并不是将用户输入写入页面的唯一情况。如果您在 HTML 标记内书写,通常是属性值,那么它将看起来像这样:<img src="file.jpg" alt="$USERINPUT" />. 在这里,过滤<or>将无济于事,因为攻击者可以输入" onload="alert('XSS')"或类似的东西,结果 HTML 将变为<img src="file.jpg" alt="" onload="alert('XSS')" />,这意味着可以执行任意 Javascript。

而且,如果您以某种方式将用户输入放入<script>标签内的某些内容中,那么您需要担心的事情有很多。

基本上,只需使用良好且经过测试的 HTML 清理功能。如果您这样做,您将不必担心所有情况。

不,因为有些方法实际上省略了 < > 标签。输入应被视为字符串,因此您需要对其进行正确编码。我建议你看看owasp测试指南v3