知乎也有这样的问题,可以拼接明文地址,进行无源跳转。好多导航站点也在用这个方法,如果是直接链接,可能会被检测出来有灰产链接,导致他的站点被封,所以用这个手段防止被封,我遇见很多导航站都是利用知乎的跳转。
最近在我站也发现了这个问题,实测子比站也存在此问题。
在代码中,看逻辑以及描述应该是这样的,golink=后应当为base64才允许跳转,原本是没问题的,但目前发现外人可以直接在后面拼接域名链接直接跳转,这就是问题所在
例子问题url:https://www.zibll.com/?golink=https://baidu.com
定位问题代码:缺少判断传入值是否为base64,疑似判断取值是否加密函数部分的代码逻辑不合理。没有解释器判断是否可解码。
临时解决方法:打开go.php文件,在if (!empty($t_url)
后添加正则验证,判断是否为base64,或者增加解释器判断是否可解码。以下为增加正则。
&& preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $t_url)
这个其实没什么用处,就算修复了,懂的人依旧可以利用你的跳转链接,他可以先把链接转为base64,再拼接使用你跳转链接,治标不治本。
有人说该php文件内有判断是否非本站的来源地址,其实这个有方法破的,让浏览器不传入来源地址,导致函数失效,也就起不到防止被利用的作用了。
以下是我的思路,有空会实现一下
在转为base64之前,先进行非对称,专属密码加密,然后go页面判断是否解密成功,若无法解密证明是非本站的,这时就不跳转了
2024.11.21,已实现以上功能,很不错
2024.11.21,在我分享以上操作到群里,初一分享了他的思路,原本我还打算开发循环记录所有文章中的链接作为名单的,但是他想到更好的方法,【Post传递的是URL,你增加一个post_id,再用外部函数通过文章ID检索文章内是否包含这个链接,不包含跳转回去】,确实是个好方法,但有一点要说明,后来我看到这个golink生成链接的函数不止应用在文章帖子中,其他地方也存在调用该函数,所以不是很适用于部分场景。部分场景下,如果没有传入文章id或帖子id呢?这就让我回归我之前想循环全部文章的问题了,所以这个可以pass了。
2024.11.23,增加了黑名单功能,黑名单内的域名不进行跳转,并提示可能违规,名单已接入某开源项目gfw域名名单,以及腾讯拦截检测,非常适合论坛站点,用户的违规链接不给他跳转,有兴趣的可以自己搞一下。因为我不用论坛功能,所以不打算分享了,就是自己随便折腾一下,记录想法。