java - 如何安全地代理来自任何 url 的图像并避免漏洞利用?

标签 java jersey jax-rs

我想在我的网站上代理来自任何其他网站的图像,例如:

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/

相关文章:

java - 有没有办法分离出异常原因中提供的信息?

android - HTTP 状态 405 - 方法不允许(jax-rs 服务)

jersey - Jersey :给定无效的请求正文时,返回400错误而不是500

java - 通过 Content-Type 参数调用 REST 服务的注释

web-services - JAX-RS:getClasses与getSingletons

java - 使用 JComboBox 作为 JTable 中的单元格编辑器的焦点问题

java - Swing:区分用户引起的组件大小调整和自动组件大小调整的问题(编写自定义布局管理器)

java拉绳直接图片

java - 传递查询参数rest客户端

java - 构建期间发生错误。在项目上运行生成器 'CDI (Contexts and Dependency Injection) Builder' 时出错