我认为这个问题的一点背景不会有什么坏处:
我有一个网络服务,我可以将图像上传到它,然后通过 api 调用通过 id 检索它们。返回值是指向服务器上实际图像的链接。但是,如果请求被劫持,则很容易替换该数据。
因此,由此产生的问题是,您可以将链接替换为" onerror="alert(whatever);
并且它会用"whatever"提醒用户,因为此链接被放置在<img src="<?= api/get.php?image_id=x ?>" />
变得<img src="" onerror"alert(whatever);" />
。
我该如何防止这种情况发生?有没有办法在将链接插入图像标签之前对其进行转义?或者更好的是 base64 链接?
我尝试过使用以下方法失败:
1. urlencode(( 2. base64_encode((
任何帮助不胜感激!谢谢!
附言我无法发送 base64 编码的图像,因为我需要能够轻松复制图像的链接。
当我写这个问题时,SO提出了一些相关主题,我发现htmlspecialchars()
可以很好地解决这个问题。但是,这可能仍然不够,因为这仅适用于我的用例,而不是每个可能的用例。请随时提出更多解决方案。
听起来第一个问题是你允许用户控制文件名。如果要控制和托管上传,请生成 guid 并使用它来存储文件。删除用户控制文件名的功能会消除他们可以添加"
以突破<img src"
上下文的机会。
我不明白为什么urlencode()
会失败。只要"
显示为%22
,就可以防止该数据脱离属性上下文。
您还需要确保<>
字符也已编码。为此,您可能需要使用htmlentities()