我想在我的网站上代理来自任何其他网站的图像,例如:
http://example.com/image?url=XXX
其中 XXX
是网络上任何图片的 URL,很可能是来自 Twitter、Facebook 或其他社交网络的图片。
我怎样才能安全地做到这一点,以及
- 避免成为 open redirect (即阻止黑客尝试使用这样的网址
http://example.com/images?url=http://SomeHackerWebsite.com/steal_cookies_or_redirect
- 强制浏览器将响应视为图像,无论如何
我正在使用 Java/Jersey/JaxRS,并且正在考虑将响应媒体类型设置为 image/*
但不确定这是否足够,因为我做不到真正将任何网址列入黑名单,因为我无法确定 Twitter/Facebook/等的最佳白名单。
目前我已经在做以下事情:
- 使用安全的、仅限 http 的 cookie,这样第 3 方 javascript 就无法窃取我网站的 cookie
- 只允许经过身份验证的请求
- 对请求进行签名,这样用户就无法轻易篡改彼此的请求,但这并不能阻止原始请求成为对非图像内容的请求。
最佳答案
这是一个非常大而且很难的问题。我认为必须使用多种方法来确保安全。例如返回 base64 而不是图像。也有一些缺点:
- base64 编码使文件大小比其原始二进制表示大约大 33%,这意味着更多的数据传输(这在移动网络上可能会非常痛苦)
- IE6 或 IE7 不支持数据 URI
- base64 编码数据的处理时间可能比二进制数据更长(有人想对此进行研究吗?)(同样,这对于 CPU 和内存更有限的移动设备来说可能会非常痛苦)(旁注: CSS background-images 似乎实际上比 img 标签更快)
另一种方式是我们有标签系统!在这个系统图像中,访问了很多时间检测到的和那些被人类考虑的。
第三种方式是考虑请求的来源。如果您有可疑网站,您可以考虑那些网站引用它的图像。
关于java - 如何安全地代理来自任何 url 的图像并避免漏洞利用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41107262/