V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
oldshensheep
V2EX  ›  程序员

关于外链图片带来的问题的思考

  •  
  •   oldshensheep ·
    oldshensheep · 314 天前 · 2543 次点击
    这是一个创建于 314 天前的主题,其中的信息可能已经有所发展或是发生改变。

    关于外链图片带来的问题的思考

    现在很多网站提供了链接图片并预览的功能,但是这可能会泄露某些信息给那些图片提供者。而如果图片提供者是帖子的发布者,那么 ta 就可能会达成某种目的。

    现在很多邮件会自动加载外链图片,这可以用来判断你是否打开了这个邮件。如果别人有某种目的,发个邮件就可能获取你的 IP 。

    本文做了一下总结,没有参考其他文章,仅仅根据自身知识总结。所以可能会有所错误。 image

    可能会有以下隐患

    以下均为最坏的情况

    泄露 IP 给图片提供者

    网站加载图片时直接发送请求到图片地址,那么图片提供者就可以获取加载这个图片的用户 IP ,如果使用了分流规则,那这个 IP 可能是你的真实 IP (国内地址直连),或者代理 IP 。

    泄露访问这个图片的浏览器的 UserAgent 、页面的域名、浏览器语言等信息

    图片提供者还可以获取加载图片的页面的域名。如用户通过 https://abc.example.com/e.html 加载了一个图片 A ,那么默认情况下,图片 A 的提供者可以知道某用户通过 abc.example.com 查看了图片。这个是通过 img 的 referrerPolicy 属性来控制的。

    还有 各种请求头信息:User-Agent 、Accept-Language

    泄露访问的时间

    访问就会发送请求,访问时间是一个很重要的信息

    如何解决这个问题?

    针对网站运营者

    以下方法代价由高到低

    缓存用户图片

    针对用户外链的图片,可以在发帖时就缓存到服务器,然后改变原链接地址,类似于用户上传图片。

    这种方法是隐私性最好的,但是当外链的图片变化时不能及时感知。 优点:

    1. 无法获取访问者 IP 和 Header 等信息
    2. 无法获取访问时间

    缺点:

    1. 存储大量图片

    参考 GitHub

    解决方法有很多,可以看看 GitHub 是怎么解决的。( GitHub 最近更新了生成的 URL )

    1. 针对用户直接通过浏览器上传图片的场景。Github 会生成一个 https://github.com/{{owner}}/{{repo}}/assets/{{uuid4}} 的链接,然后通过 302 跳转到github-production-user-asset*****.amazonaws.com/******实际图片地址,这种情况显然除了 GitHub 谁也得不到访问者的地址和 referrer ,是安全的。

    2. 通过外链链接图片 Github 支持 MarkDown ,可以填图片外链。这种情况 Github 会使用https://camo.githubusercontent.com这个域名代理用户图片,然后加载。这种情况显然也是安全的。

    方法 2 其实很久前开源了一个项目https://github.com/atmos/camo.git 不过后来没有维护了

    GitHub 的方法隐私性中等,不过不会有前一种方法图片更新导致的问题,而且不用存储图片。 优点:

    1. 无法获取访问者 IP 和 Header 等信息

    缺点:

    1. 可以获取访问时间

    退而求其次

    上面的方法都要求服务端处理,要消耗较多的资源

    限制图片域名

    可以限制图片提供者,也就是只允许加载指定域名的图片。

    这种情况下,只有指定的图片提供者可以获取用户信息,但是图片提供者也可能会提供一些信息给上传图片的发布者,如浏览量等,所以域名要谨慎选择。

    PS:v 站在用户评论上采用了这个方案。

    限制 referrer

    MDN referrerPolicy 默认情况下是 strict-origin-when-cross-origin (详细解释见文档)会发送页面域名给图片提供者。 设置为 no-referrer 就不会发送域名数据。

    PS:v 站在用户评论和帖子外链上采用了这个方案。

    针对网站用户

    针对一些特殊网站,可以考虑默认不加载图片。

    针对邮件,关闭邮件外链图片的自动加载功能

    利用这个东西

    邮件

    利用图片自动加载的特性也不是什么新鲜玩意,有些邮件追踪就是用图片自动加载来实现的,而追踪的目的很可能是是否点开了这个邮件。这样一来那些部分邮件客户端提供的代理图片功能就用处不大了(除非是用的上面说的立即缓存方案)。

    当然代理图片可以隐藏客户端的 IP 和 Header 等信息,也算是一种折衷。

    网站

    部分网站使用这种功能。

    这个

    当然了,在座的各位一个都跑不掉。

    17 条回复    2023-05-21 14:44:06 +08:00
    j20001112
        1
    j20001112  
       314 天前 via iPhone
    iCloud private rely 在 safari 和邮件中就是防止这种现象,Mac 也只能让网站知道大概的设备数据,没办法浏览器设备指纹。像亚马逊封号用 Chrome 创建新号很容易就被追踪到连带封了,而 Mac 的 safari 就不会
    oldshensheep
        2
    oldshensheep  
    OP
       314 天前
    看了有些是 RSS 加载的,有些是 BOT ,好像 HK 的比较多,手机是 IPhone 的比较多
    感觉可以用来做网站流量分析了……
    oldshensheep
        3
    oldshensheep  
    OP
       314 天前
    后端的只存了原始数据,手动看比较麻烦,有时间写个统计程序。
    beijinglowb
        4
    beijinglowb  
       314 天前 via iPhone
    找可靠些的图床,别用那种私人的
    oldshensheep
        5
    oldshensheep  
    OP
       314 天前
    @beijinglowb
    好的,在座的信息我都记录下来了
    SunsetShimmer
        6
    SunsetShimmer  
       314 天前
    请教一下这样的后端怎么实现(加记录功能)?免费的方案可能是 workers+KV ?

    https://alghjk.oldshensheep.workers.dev/api/test
    oldshensheep
        7
    oldshensheep  
    OP
       314 天前
    @SunsetShimmer 用的 workers+D1 ,就是那个 sqlite 数据库,还处于 Alpha 阶段
    butanediol2d
        8
    butanediol2d  
       313 天前
    现在大部分的邮箱客户端都默认不会自动加载外链资源吧
    gam2046
        9
    gam2046  
       313 天前   ❤️ 1
    @butanediol2d #8 也不单看客户端行为,有些邮件服务商,比如 Gmail ,会直接保存一份,替换掉邮件中的图片地址。邮件,你别看支持 HTML ,但是支持的程度非常有限,每个服务商都有自己的规则,所以现在许多垃圾邮件索性直接就发一个大图了。
    lisxour
        10
    lisxour  
       313 天前
    你说的不就是十几年前 QQ 空间玩烂的东西嘛。。。

    签名挂一张图片,可以显示访问者物理地址、IP 地址、浏览器信息,访问者数量这些信息。。。
    lisxour
        11
    lisxour  
       313 天前
    @lisxour 现在这种应用也很常见,基本上只要能挂外链图片签名的各种论坛你都能看见有显示 ip 、浏览器信息的这种签名,就连现在的很多站长工具也有这种图片链接类型的统计。
    xuangoer666
        12
    xuangoer666  
       313 天前 via Android
    警告

    alghjk.oldshensheep.workers.dev 的连接不安全:
    - 证书不受信任

    是否继续?

    被浏览器发现了?😂
    oldshensheep
        13
    oldshensheep  
    OP
       313 天前
    @lisxour 对,不过现在 QQ 空间不行了吧(不玩 QQ 空间了,不太清楚),但是现在还有很多网站存在这个问题。
    oldshensheep
        14
    oldshensheep  
    OP
       313 天前
    @xuangoer666 可能是没走代理,被墙了
    terence4444
        15
    terence4444  
       313 天前 via iPhone   ❤️ 2
    我一直在用 Firefox 和 插件 Matrix ,跨域名请求可以清楚地看见。默认阻挡。

    虽然稍有不便但我觉得值得
    oldshensheep
        16
    oldshensheep  
    OP
       313 天前
    @terence4444 这个插件的确很不错,可以根据域名是否是第三方的分别 Block ,CSS ,Image ,Script 等外链
    20160409
        17
    20160409  
       312 天前
    编程随想的博客里提到过,有拿 1 像素的图片去钓 IP 的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5293 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:56 · PVG 13:56 · LAX 22:56 · JFK 01:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.