我从当前窗口的片段标识符(location.hash
)获取一个字符串。我想将该字符串用作location.replace(str)
的参数。
在正常情况下,字符串将来自我控制的代码,所以我并不担心验证字符串是否为URL。如果字符串不是URL,则替换调用将失败。没关系。
我关注的是确保字符串不是javascript:
URL或其他任何允许某人在我的域上运行任意Javascript的内容。目前,我只是检查str.indexOf('http') == 0
。
这还不够或者我应该更多地消毒这个字符串吗?
答案 0 :(得分:3)
你提出的消毒是不够的。
攻击者可以重定向到包含base64编码的html / javascript的data:uri
网址。这将允许攻击者执行任意javascript代码。例如,此代码段将警告'xss'(在firefox,safari和opera中)
var data = 'data:text/html;base64,PHNjcmlwdD5hbGVydCgiWFNTIik8L3NjcmlwdD4=';
location.replace(data);
此外,可以重定向到匿名FTP网址,或使用其他一些模糊协议。
请使用白名单方法,而不是将协议/关键字列入黑名单。在您的javascript代码中维护一个好的URL列表。然后,读取片段标识符并查看它是否在此已知的URL列表中。如果不是,请停止该过程。
在安全方面,白名单总是优于黑名单。