不,在现代浏览器中,不可能通过标签的styleorsrc属性实现 XSS。<img>
所以这些都不会在任何最新的浏览器中执行 JS 代码:
<img src="javascript:alert(1)">
<img src="x.jpg" style=background-image:url('javascript:alert(2)')">
CSS 属性中对 Javascript 的支持早已被放弃。你可以在这里找到一些关于它的旧参考资料。
分析您的示例代码
location.hash总是以#符号开头。由于这个字符在 JS 中是非法的,并且不是新 URL 的有效开头,所以一开始就不可能出现 XSS。(例如,eval(location.hash)总是产生语法错误。)
让我们假设,您忽略#andlocation.hash可以真正包含您想要的任何字符串。
那么这个安全检查是有缺陷的:
(location.hash.indexOf('javascript:') !== 0)
攻击者仍然可以构造以 . 开头的 URL JaVaScRiPt:。此外,假设任何实现都不允许前导空格或控制字符(例如\t\x00javascript:)是有风险的。那么 URL 编码呢?以开头的有效负载javascript%3a将通过您的过滤器。另外,您要允许该data:协议吗?如果您想将 URL 限制为绝对位置,您可以将开头列入白名单,http://而https://不是列入黑名单javascript:。
这可以:
img.src='some/local/path/'+location.hash;
即使该src属性容易受到脚本代码的影响,您的前缀some/local/path/也可以确保它不能转换为 JS URL。但是,攻击者可以指定同一服务器上的图像文件的任何相对路径,您可能会觉得这是不受欢迎的。
注意:这是关于构建恶意javascript:URL。如果你想使用用户控制的值,比如location.hashHTML 输出或不同的上下文,你必须正确地清理字符串。