清理将传递给location.replace的不受信任的url字符串

时间:2010-09-21 02:35:33

标签: javascript security xss

我从当前窗口的片段标识符(location.hash)获取一个字符串。我想将该字符串用作location.replace(str)的参数。

在正常情况下,字符串将来自我控制的代码,所以我并不担心验证字符串是否为URL。如果字符串不是URL,则替换调用将失败。没关系。

我关注的是确保字符串不是javascript: URL或其他任何允许某人在我的域上运行任意Javascript的内容。目前,我只是检查str.indexOf('http') == 0

这还不够或者我应该更多地消毒这个字符串吗?

1 个答案:

答案 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列表中。如果不是,请停止该过程。

在安全方面,白名单总是优于黑名单。