阻止网站被恶意反向代理访问

笔记 · 05-12 · 292 人浏览
阻止网站被恶意反向代理访问


做站的朋友们,不知道你们知否有过这种经历。你天天熬夜做内容,深更半夜搞优化。突然一个臭流氓,直接反代你的网站,除了网站名,其它的一模一样的网站。你费尽千幸万苦的东西,别人直接拿去套用,一边偷你内容还要压榨你那点可怜的服务器资源,这个你能忍?

反代的危害

  • 首先会占用服务器资源、CDN资源、流量费,你花钱让别人收益,你能忍?
  • 搜索引擎针对有和会你网站一模一样的内容,有降低降低公信力、降权等风险;
  • 你的网站挂的Adsense、百度联盟等广告,如果遇到而已点击,也是有风险的。

防止反代的有效策略

1.从服务器日志中,找出反代是通过哪种方式反代你的网站,然后通过下列「屏蔽反代」方法屏蔽;

2.举报给 谷歌安全浏览百度举报平台 。搜索引擎判断该内容后,会针对站点降权甚至会把镜像站点从搜索结果中删除。

屏蔽恶意反代方法总结

屏蔽方法很多,可以在系统层面利用防火墙屏蔽,可以在服务上屏蔽,也可以在内容上屏蔽,没有必要都配置一遍,选择合适的即可。

1、防火墙配置

如果代理服务器是直接连接我们服务器,可以在防火墙上禁止该 IP 连接,以 CentOS 7 为例:

[root@UN ~]# firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address="1.1.1.1" drop' --permanent
[root@UN ~]# firewall-cmd --reload

如果代理服务器更换了 IP,我们就要再配置防火墙,而且若代理服务器使用了 CDN 来反代,那么这种方法将不适用,除非你确定自己也不会用 CDN。

2、Nginx 配置

在站点配置文件中新增一段:

server {
......
       if ($host !~ 自己的网站地址) {
           return 444;
       }
......
}

代理服务器访问直接不回应,若要跳转到自己的网站,可以把 444 改成网站链接,此方法最简单彻底。

3、.htaccess 屏蔽

.htaccess

RewriteEngine On
RewriteBase /
php_value auto_append_file proxy.php

proxy.php

<?php
$f = getenv("HTTP_X_FORWARDED_FOR");
$server = getenv("HTTP_HOST");
if (($f!="")&&($server!="自己的网站地址")&&($server!="自己的网站地址")){
    echo '本服务器禁止反向代理!';
}
?>

4、JavaScript 屏蔽

直接在网页中添加:

<script type="text/javascript">  
if (document.domain != '自己的网站地址' && document.domain != '自己的网站地址'){  
window.location.href='https://自己的网站地址';  
}  
</script> 

如果是反代者使用了 iframe,那么应该再加一段判断:

<script type="text/javascript">
  if (top.location != self.location) {
    top.location=self.location;
}
</script>

或者

<script type="text/javascript">
var url=window.location.href;
if(window!=parent)
parent.navigate(url);
</script>

厉害的反代者会直接把 js 替换掉,所以这种方法不能完美屏蔽。

5、PHP 屏蔽

第一种

<?php
if($_SERVER['SERVER_NAME'] != 'chun-ni.fun' ||$_SERVER['SERVER_NAME'] != 'chun-ni.fun' )
{
exit('非法反向代理访问');
}
?>

第二种

$proxy_rs = $this -> proxy_filter();
if( $proxy_rs != '自己的网站地址' || $proxy_rs != '自己的网站地址' )
{
    echo '非法反向代理访问';
    header('Location: https://自己的网站地址');
    exit;
}
public function proxy_filter()
{
    $svrUrl = 'http://' . $_SERVER['SERVER_NAME'].$_SERVER["PHP_SELF"];
    if (!empty($_SERVER["QUERY_STRING"]))
    {
        $svrUrl .= "?".$_SERVER["QUERY_STRING"];
    }
    return $svrUrl;
    return $_SERVER['SERVER_NAME'];
}

6、refer 屏蔽

此方法针对 301 跳转,Nginx 下配置:

server{
.....
if ($http_referer ~* (.自己的网站地址)){
  return 444;
}
......
}

由于我网站的使用的Nginx,其它的方法未验证其。方法收集于互联网,仅供参考。如已失效,烦请反馈。


作者 | 王耍耍


网站相关
THEME JASMINE · FOREVERBLOG