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