保护 Go 跳转,防止被恶意利用

  • 内容
  • 相关

或是出于优化 SEO,或是出于加强网站体验,很多博客都给文章中的外部链接加上了个二次跳转,本博客也不例外。

比如说我在这插入一个 百度 的超链接,你点击访问后先会被跳转到本博客的跳转页面,一段动画后才会真的转至百度的首页。

看似合情合理,实则暗藏一个小漏洞!

情境分析

举个栗子,假设有个不怀好意的坏蛋,要传播一个不怀好意的网站 www.baidu.com (这里用百度做示范好了。。),通常这类网站一发到 QQ 里 QQ 就会有一个大大的红色叹号以示危险:
1.jpg

如果利用像本站的跳转功能,就能轻易地将链接“洗白”:

  1. http://www.suppore.cn.cn/go/?url=www.cccxx.com

2.jpg

要是有不明真相的小白点击了,在本站的“跳转”下最终访问的就会是恶意的链接网址,无辜的链接跳转功能瞬间成了“帮凶”。

解决办法

那么如何防止这种情况的发生呢?

我的思路是这样的:

在跳转页面中,先用 PHP 的‘$_SERVER["HTTP_REFERER"]’函数获取来源链接,然后判断来源链接是不是属于本站,如果不是,再判断跳转链接,如果跳转链接也不属于本站,就给出一个提示:你将要访问的网站不属于本站范围,请谨慎访问。反之则正常跳转。
3.jpg

这里有个难点就是判断目标网址是不是属于本站的一个页面,也就是对“敌我”的一个判断。

比方说本站的网址是 http://www.suppore.cn ,一些二级页面如 http://demo.suppore.cn、https://suppore.cn/about 也属于本站。而 http://www.baidu.com/?www.suppore.cn虽然包含“www.suppore.cn”,访问后它却是百度的首页。因此不能简单粗暴的通过判断网址中是否存在 “www.suppore.cn” 来得出结论

仔细的观察域名的结构你就会发现只要是属于 www.suppore.cn 的网址一定会满足以下规律:

  • 如果 www.suppore.cn 的前面有内容,那么一定不会有“?”出现,比如说 abc?.www.suppore.cn 是不存在的
  • 如果 www.suppore.cn 的后面还跟有内容,那么一定是“/”,或“?”,比如说 www.suppore.cn/123 或 www.suppore.cn?from=123

利用以上两个规律写了个判断函数如下:

/**
 * 判断是不是自己的域名
 * @param $domain 要进行判断的域名
 * @param $my 自己的域名
 * @return 对比结果
 */
function isMyDomain($domain, $my) {
    preg_match('/([^\?]*)/i', $domain, $match);
    if(isset($match[1])) $domain = $match[1];
    preg_match('/([\w-]*\.[\w-]*)\/.*/i', $domain.'/', $match);
    if(isset($match[1]) && $match[1] == $my) return true;
    return false;
}

最终代码

按照以上思路完成整个跳转页面的编写后,测试了一下效果非常不错:只要是从本站点开的跳转网址,都能正常进行跳转,从而第三方打开的跳转,则会弹出提示。

最终完整的跳转页面源代码如下:(代码中的判断思路肯定不唯一,如果您有更好的判断方式,欢迎在下方留言交流!)

管理员设置 回复 可见隐藏内容

效果演示

还是以百度为例,如果你 点击 https://suppore.cn/go/?url=www.baidu.com 访问,直接就跳转了,如果你手动复制这个跳转网址再粘贴到浏览器访问,则会弹出提示。

如果是本站的站内链接,如 https://suppore.cn/go/?url=demo.suppore.cn 无论以何种方式打开都是直接跳转。

保护 Go 跳转,防止被恶意利用
         本页正文内容约6031个文字
         本文标签:

         版权声明:若无特殊注明,本文皆为“懒人的小窝”原创,转载请保留文章出处。

         本文链接:https://suppore.cn/498.html   百度已收录

发表评论

电子邮件地址不会被公开, 推荐使用QQ快速评论!

评论

29条评论
  1. avatar

    放肆的眼神 Lv.1 Chrome 66.0.3359.139 Chrome 66.0.3359.139 Windows Windows 回复

    学习学习

    江苏省扬州市 移动

    1. avatar

      小世界 Lv.2 Chrome 53.0.2785.104 Chrome 53.0.2785.104 Windows Windows 回复

      表情 写得好好哟,我要给你生猴子!
      表情 骚年,我怀疑你写了一篇假的文章!
      滴!学生卡!打卡时间:上午11:10:14,请上车的乘客系好安全带~

      河南省郑州市 联通

      1. avatar

        丑小吖 Lv.1 Chrome 66.0.3359.170 Chrome 66.0.3359.170 Windows 7 Windows 7 回复

        学习学习

        广东省广州市 电信

        1. avatar

          于瀚超 Lv.1 Chrome 66.0.3359.170 Chrome 66.0.3359.170 Windows 7 Windows 7 回复

          牛逼呀

          广东省广州市 电信

          1. avatar

            Jun Lv.1 Chrome 63.0.3239.108 Chrome 63.0.3239.108 Windows Windows 回复

            啦啦啦啦啦

            广东省广州市 电信

            1. avatar

              稚气oo Lv.1 Chrome 55.0.2883.87 Chrome 55.0.2883.87 Windows 7 x64 Edition Windows 7 x64 Edition 回复

              啦啦啦啦啦啦啦

              河南省许昌市 联通

              1. avatar

                不错 Lv.1 Safari 11.0 Safari 11.0 iPhone iOS 11.2.6 iPhone iOS 11.2.6 回复

                不错

                北美地区

                1. avatar

                  猫少 Lv.1 Internet Explorer 11.0 Internet Explorer 11.0 Windows 7 x64 Edition Windows 7 x64 Edition 回复

                  猫少博客 www.qq2s.cn,欢迎友联

                  云南省昆明市 电信

                  00:00 / 00:00
                  顺序播放