Security 允许用户创建链接的风险?

Security 允许用户创建链接的风险?,security,web,xss,Security,Web,Xss,我正在设置一个web环境,用户可以在其中创建链接,但是他们只能修改href属性,不能自己键入标记 所以基本上任何href值都是允许的;http/ftp/mailto/随便什么 如果我像这样打开href属性,我的站点是否存在XSS或其他风险?如果是,它们是什么?我应该如何处理它们 您必须确保href值是有效的URL。如果您不逃避用户输入,那么mySQL注入攻击将成为可能 用户还可以输入javascript: <a href="javascript:window.close();">Ja

我正在设置一个web环境,用户可以在其中创建链接,但是他们只能修改href属性,不能自己键入
标记

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


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

您必须确保href值是有效的URL。如果您不逃避用户输入,那么mySQL注入攻击将成为可能

用户还可以输入javascript:

<a href="javascript:window.close();">Javascript will close the browser window on click</a>

有一些URL方案,如
javascript:
或可能的
数据:
,如果用户被骗点击它们,它们本身就可以充当XSS向量。您应该维护一个已知安全URL方案的白名单(如
http
https
ftp
,等等),并禁止任何不以此类方案开头的URL

请注意,简单地将已知的危险URL方案列入黑名单并不是一种安全的方法,因为您不可能知道可能用作攻击向量的所有方案(因为这可能取决于用户安装的第三方软件)。尤其要记住,URL方案应该是不区分大小写的;一个简单地禁止以
javascript:
开头的URL的天真的黑名单实现可能会被
javascript:
URL略过

(如果需要,您可以允许使用无模式的相对URL,但如果是这样,请确保对其进行保守的解析,这样攻击者就不可能将有害的绝对URL伪装为相对URL。特别是,我建议在第一个斜杠(
/
)之前包含冒号(
)的任何URL,如果有的话,将被视为受白名单约束的绝对URL。为确保这一点,您可能还希望将字符串“
/
”前置到任何尚未以“
/
”或“
/
”开头的相对URL,以消除任何潜在的解析歧义。)


您需要确保的另一件事是正确地HTML转义将嵌入HTML属性的任何字符串,包括url(尤其是用户提供的url)。特别是,任何
字符都需要替换为
&字符实体,以及(对于双引号属性)任何带有
字符的
。替换
+1时,OP还应确保任何本地GET链接不易受到CSRF的攻击,否则用户可能会输入例如“
http://www.example.com/logout
”作为他们的链接(其中
example.com
是OP的网站)。