保护GO跳转

  • A+
所属分类:技术笔记

前言

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

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

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

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

保护GO跳转

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

1
http://www.i615.cn/go/?url=www.baidu.com

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

GO模板代码

方法是在GO连接模板替换以下代码

展开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<!--?php /** * 带有来路验证和跳转提示功能的跳转页面 */ // 请将这里的网址改为自己的(顶级)域名地址 $myDomain = 'i615.cn'; // 这里用正则提取 $_SERVER["QUERY_STRING"] 而不是直接 get url // 是因为如果链接中自身带有 GET 参数则会导致获取不完整 preg_match('/url=(.*)/i', $_SERVER["QUERY_STRING"], $jumpUrl); // 如果没获取到跳转链接,直接跳回首页 if(!isset($jumpUrl[1])) { header("location:/"); exit(); } $jumpUrl = $jumpUrl[1]; // 判断是否包含 http:// 头,如果没有则加上 preg_match('/(http|https):\/\//', $jumpUrl, $matches); $url = $matches? $jumpUrl: 'http://'. $jumpUrl; // 判断网址是否完整 preg_match('/[\w-]*\.[\w-]*/i', $url, $matche); // 是否需要给出跳转提示 $echoTips = false; if($matche){ // 如果是本站的链接,不展示动画直接跳转 if(isMyDomain($url, $myDomain)) { header("location:{$url}"); exit(); // 后续操作不再执行 } $title = '页面加载中,请稍候...'; $fromUrl = isset($_SERVER["HTTP_REFERER"])? $_SERVER["HTTP_REFERER"]: ''; // 获取来源url // 如果来源和跳转后的地址都不是本站,那么就要给出提示 if(!isMyDomain($fromUrl, $myDomain)) { $echoTips = true; } } else { // 网址参数不完整 $url = '/'; $title = '参数错误,正在返回首页...'; } /** * 判断是不是自己的域名 * @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]) &amp;&amp; $match[1] == $my) return true; return false; } ?-->




<!--?php &lt;br ?--> if($echoTips) {
echo '';
} else {
echo '';
echo '';
}
?&gt;

<style>
body{background:#fff;font-family:Microsoft Yahei;-webkit-animation:fadeIn 1s linear;animation:fadeIn 1s linear}<br />
@-webkit-keyframes fadeIn{from{opacity:0}<br />
to{opacity:1}<br />
}@keyframes fadeIn{from{opacity:0}<br />
to{opacity:1}<br />
}#circle{background-color:rgba(0,0,0,0);border:5px solid rgba(0,183,229,0.9);opacity:.9;border-right:5px solid rgba(0,0,0,0);border-left:5px solid rgba(0,0,0,0);border-radius:50px;box-shadow:0 0 35px #2187e7;width:50px;height:50px;margin:0 auto;position:fixed;left:30px;bottom:30px;-moz-animation:spinPulse 1s infinite ease-in-out;-webkit-animation:spinPulse 1s infinite ease-in-out;-o-animation:spinPulse 1s infinite ease-in-out;-ms-animation:spinPulse 1s infinite ease-in-out}<br />
#circle1{background-color:rgba(0,0,0,0);border:5px solid rgba(0,183,229,0.9);opacity:.9;border-left:5px solid rgba(0,0,0,0);border-right:5px solid rgba(0,0,0,0);border-radius:50px;box-shadow:0 0 15px #2187e7;width:30px;height:30px;margin:0 auto;position:fixed;left:40px;bottom:40px;-moz-animation:spinoffPulse 1s infinite linear;-webkit-animation:spinoffPulse 1s infinite linear;-o-animation:spinoffPulse 1s infinite linear;-ms-animation:spinoffPulse 1s infinite linear}<br />
@-webkit-keyframes spinPulse{0%{-webkit-transform:rotate(160deg);opacity:0;box-shadow:0 0 1px #505050}<br />
50%{-webkit-transform:rotate(145deg);opacity:1}<br />
100%{-webkit-transform:rotate(-320deg);opacity:0}<br />
}@-webkit-keyframes spinoffPulse{0%{-webkit-transform:rotate(0deg)}<br />
100%{-webkit-transform:rotate(360deg)}<br />
}#loading-text{position:fixed;left:110px;bottom:35px;color:#736D6D}<br />
@media screen and (max-width:600px){#circle,#circle1{left:0;right:0;top:0;bottom:0}<br />
#circle{margin:120px auto}<br />
#circle1{margin:130px auto}<br />
#loading-text{display:block;text-align:center;margin-top:220px;position:static;margin-left:10px}<br />
}<br />
.warning{max-width: 500px;margin: 20px auto;}<br />
.wtitle {font-size: 22px;color: #d68300;}<br />
.wurl {overflow: hidden;text-overflow: ellipsis;white-space: nowrap;color: #827777;}<br />
.btn {display: inline-block;line-height: 20px;cursor: pointer;border: 1px solid #A9A6A6;padding: 6px 10px;font-size: 14px;text-decoration: none;}<br />
.btn-green {color: #fff;background-color: #238aca;border: 1px solid #238aca;}<br />
.btn:hover {background-color: #A9A6A6;border: 1px solid #A9A6A6;color: #fff;}<br />
</style>


<!--?php if($echoTips) { ?-->
<div class="warning">
<p class="wtitle">您将要访问:</p>
<p class="wurl" title="&lt;?php echo $url;?&gt;"></p>
该网站不属于宁迂,我们无法确认该网页是否安全,它可能包含未知的安全隐患。

<a class="btn btn-green" href="&lt;?php echo $url;?&gt;" rel="nofollow">继续访问</a>
<span class="btn">关闭网页</span>

</div>
<script>  
    function closePage() {  
        // 通用窗口关闭  
        window.opener=null;  
        window.open('','_self');  
        window.close();  
        // 微信浏览器关闭  
        WeixinJSBridge.call('closeWindow');  
    }  
    </script>
<!--?php } else { ?-->
<div id="circle"></div>
<div id="circle1"></div>
<p id="loading-text">页面加载中,请稍候...</p>
<!--?php } ?-->

效果演示

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

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

Lewis

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: