我正在设置一个用户可以创建链接但的网络环境,他们只能修改href属性,而不能自己输入<a>
标记。
所以基本上允许任何href值; HTTP / FTP /的mailto /不管。
如果我将href属性保持打开状态,我的网站是否存在任何XSS或其他风险?如果是的话,它们会是什么以及我该如何处理它们?
答案 0 :(得分:2)
有一些网址方案,例如javascript:
或可能data:
,如果用户被欺骗点击它们,它们本身就可以充当XSS向量。您应该维护白名单已知的安全网址方案(例如http
,https
,ftp
等),并禁止任何未开始的网址有了这样的计划。
请注意,只是黑名单已知的危险URL方案不是一种安全的方法,因为您不可能知道可能被用作攻击媒介的所有方案(因为这可能)取决于用户安装的第三方软件等内容。特别要记住,URL方案应该不区分大小写;一个简单地禁止以javascript:
开头的网址的天真黑名单实施可能会被jAvAsCrIpT:
网址轻易绕过。
(如果你愿意,你可以允许无方案的相对URL,但如果是这样,请确保你保守地解析它们according to the standard,这样攻击者就不可能伪装一个有害的绝对URL作为相对URL。特别是,我建议在第一个斜杠(:
)之前包含冒号(/
)的任何URL(如果有)被视为绝对URL白名单。为了确保您可能还希望将字符串“./
”添加到尚未以“/
”或“./
”开头的任何相对网址中排序消除任何潜在的解析歧义。)
您需要确保的另一件事是您正确地 HTML-escape 任何字符串,包括将嵌入HTML中的URL(特别是用户提供的字符串)属性。特别是,任何&
字符都需要替换为&
字符实体,(对于双引号属性),任何"
个字符都需要"
。将<
替换为<
而将'
替换为'
也可能是一个好主意,最安全的方法可能是实际替换任何字符(除了已知的安全的,如字母数字)与其相应的HTML字符实体。在任何情况下,您编程语言可能都有一个标准函数或库来执行此操作(例如PHP中的htmlspecialchars()
)。
Ps。另请参阅OWASP XSS Filter Evasion Cheat Sheet,了解您的实施应该能够抵制的可能攻击的一些示例。
答案 1 :(得分:1)
您必须确保href值是有效的网址。如果您不会转义用户输入,则可能会导致mySQL注入攻击。
用户也可以输入javascript:
<a href="javascript:window.close();">Javascript will close the browser window on click</a>