这正是我不知该如何实现的目标。作为一名 iOS 逆向工程师,我的思路是:如果我能从源代码中了解服务器发送这张图片的方式或位置,我就可以逆向追踪,找到服务器在本地加载该图片的位置。但我读 Ruby 代码就像在读伪代码,因此定位服务器发送该图片的位置对我来说是一项极其艰巨的任务
不过,对于熟悉源代码的人来说,这应该会容易得多。
在 discourse/app/models/upload.rb at main · discourse/discourse · GitHub 中,我看到了 uploads 表,它存储了用户的所有上传文件。对于用户 Baal998(其用户 ID 为 1637),我执行了 SELECT * FROM uploads WHERE user_id = '1637';,结果如下:
id | user_id | original_filename | filesize | width | height | url | created_at | updated_at | sha1 | origin | retain_hours | extension | thumbnail_width | thumbnail_height | etag | secure | access_control_post_id | original_sha1 | animated | verified | verification_status
------+---------+-------------------+----------+-------+--------+-----------------------------------------------------------------------------+----------------------------+----------------------------+------------------------------------------+--------+--------------+-----------+-----------------+------------------+------+--------+------------------------+---------------+----------+----------+---------------------
2210 | 1637 | 2.pic.jpg | 60610 | | | /uploads/default/original/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183.jpg | 2016-08-08 09:37:13.937306 | 2018-01-05 02:38:49.498264 | cb2188eaeecc3a648f021fa00da4734bd60ca183 | | | jpg | | | | f | | | | | 1
(1 row)
这与在 Rails 中运行 Upload.find(user_avatar.custom_upload_id).url 得到的结果相同。
我的猜测是,在用户上传头像后,Discourse 会对原始头像文件进行一些处理,并将优化后的文件存储在其他位置?
在表 optimized_images 中,这一行看起来有些可疑:
id | sha1 | extension | width | height | upload_id | url | filesize | etag | version | created_at | updated_at
-------+------------------------------------------+-----------+-------+--------+-----------+----------------------------------------------------------------------------------------+----------+------+---------+----------------------------+----------------------------
49538 | e6dc9b0d6c18f2a4c3c0d2027534d01cfc89c84e | .jpg | 135 | 135 | 2210 | /uploads/default/optimized/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183_2_135x135.jpg | 10968 | | 2 | 2016-08-08 09:37:13.937306 | 2016-08-08 09:37:13.937306
(1 row)
该行的 sha1 和 filesize 与 https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png 匹配,但在服务器上该文件并不存在。
root@iosre:/var/discourse/shared/standalone# ls /uploads/default/optimized/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183_2_135x135.jpg
ls: cannot access /uploads/default/optimized/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183_2_135x135.jpg: No such file or directory
不知道问题出在哪里。
问题已解决:
我论坛上的一位用户告诉我,该头像图片可能存储在 nginx 的 proxy_cache_path 缓存中,通常路径为 /var/nginx/cache,但我既找不到 proxy_cache_path 配置,也找不到 /var/nginx/cache 目录。
受他启发,我通过 launcher enter app 进入 discourse 应用,随后找到了 nginx 缓存:
root@iosre:/var/discourse/shared# /var/discourse/launcher enter app
WARNING: Docker version 17.05.0-ce deprecated, recommend upgrade to 17.06.2 or newer.
root@iosre-app:/var/www/discourse# cd /var/nginx/cache
root@iosre-app:/var/nginx/cache# ls
0 1 2 3 4 5 6 7 8 9 a b c d e f
root@iosre-app:/var/nginx/cache#
并删除了所有缓存:
root@iosre-app:/var/nginx/cache# ls
root@iosre-app:/var/nginx/cache#
图片随后消失了。