1

我正在建立一个网络环境,用户可以在其中创建链接,但他们只能修改 href 属性,<a>不能自己输入标签。

所以基本上任何 href 值都是允许的;http/ftp/mailto/随便。

如果我这样打开 href 属性,我的网站是否存在 XSS 或其他风险?如果是,它们会是什么,我应该如何处理它们?

4

2 回答 2

3

如果用户被诱骗点击它们,则有一些 URL 方案,例如javascript:或可能data:,它们本身可以用作 XSS 向量。您应该维护一个已知安全 URL 方案(如、、等)的白名单,并禁止任何不以此类方案开头的 URL。httphttpsftp

请注意,简单地将已知的危险 URL 方案列入黑名单并不是一种安全的方法,因为您不可能知道所有可能用作攻击媒介的方案(因为这可能取决于用户安装的第三方软件等)。特别是,请记住 URL 方案应该不区分大小写;简单地禁止以开头的 URL 的幼稚黑名单实现javascript:可能会被 URL 轻松绕过jAvAsCrIpT:

(如果需要,您可以允许无方案的相对 URL,但如果是这样,请确保您根据标准保守地解析它们,以便攻击者无法将有害的绝对 URL 伪装成相对 URL。特别是,我建议将:在第一个斜杠 ( ) 之前包含冒号 ( ) 的任何 URL(/如果有)视为受白名单约束的绝对 URL。为了确保您可能还希望在./任何相对 URL 前添加字符串“”不是以“ /”或“ ./”开头的,以消除任何潜在的解析歧义。)

您需要确保的另一件事是正确地对任何字符串进行 HTML 转义,包括将嵌入 HTML 属性中的URL(尤其是用户提供的 URL)。特别是,任何&字符都需要替换为&amp;字符实体,并且(对于双引号属性)任何"带有&quot;. <&lt;和替换也可能是一个好主意'&#39;最安全的方法可能是用它们对应的 HTML 字符实体实际替换任何字符(除了已知的安全字符,如字母数字)。无论如何,您的编程语言可能有一个标准函数或库来执行此操作(例如htmlspecialchars()在 PHP 中)。

附言。另请参阅OWASP XSS Filter Evasion Cheat Sheet,了解您的实现应该能够抵抗的一些可能攻击的示例。

于 2013-11-14T12:16:24.903 回答
1

必须确保 href 值是有效的 URL。如果你不逃避用户输入,它会使 mySQL 注入攻击成为可能。

用户也可以输入javascript:

<a href="javascript:window.close();">Javascript will close the browser window on click</a>
于 2013-11-14T08:49:57.793 回答