如何安全地从任何URL代理图像并避免利用?

时间:2016-12-12 18:32:20

标签: java jersey jax-rs

我想从我网站上的任何其他网站代理图片,例如:

http://example.com/image?url=XXX

其中XXX是网上任何图片的网址,很可能是来自Twitter,脸书或其他社交网络的图片。

我如何安全地执行此操作,

  • 避免成为open redirect(即阻止黑客尝试使用此类网址http://example.com/images?url=http://SomeHackerWebsite.com/steal_cookies_or_redirect
  • 强制浏览器将响应视为图像,无论

我正在使用Java / Jersey / JaxRS,并且只考虑将响应媒体类型设置为image/*,但不确定这是否足够,因为我无法将任何网址列入黑名单,因为我无法确定twitter / facebook / etc的最佳白名单。

目前我已经在执行以下操作:

  • 使用安全,仅限http的cookie,因此第三方javascript无法窃取我的网站cookies
  • 仅允许经过身份验证的请求
  • 签署请求,因此用户不能轻易地处理彼此的请求,但这并不能阻止原始请求成为对非图像内容的请求。

1 个答案:

答案 0 :(得分:1)

这是一个非常庞大而棘手的问题。我认为必须使用多种方法来确保安全。例如,返回base64而不是image。还有一些缺点:

  • base64编码使文件大小比原始二进制表示大约33%,这意味着更多的数据(这可能在移动网络上非常痛苦)
  • IE6或IE7
  • 不支持数据URI
  • base64编码的数据可能比二进制数据需要更长的时间来处理(任何人都想对此进行研究?)(同样,对于移动设备而言,这可能会非常痛苦,因为它们的CPU和内存更加有限)(旁注: CSS background-images似乎实际上比img标签更快)

另一种方式是我们有标记系统!在这个系统图像中,可以访问许多检测到的时间和人类所考虑的时间。

第三种方式是考虑请求的来源。如果您有可疑网站,可以考虑这些网站引用它的图像。