用nginx+cookie防止简单的抓取/破解骚扰

最近公司的能从外方访问测试服务器很不稳定。查看日志是有大量的访问日志,以及很多调用wp/dedecms/phpmyadmin默认登录的地址的'破解'访问。

决定家一个简单的过滤,最早准备用basic auth,但为了尽量不干扰 普通客户的访问,尝试用cookie解决。没有cookie的话显示一个通过js设定cookie的页面。有cookie的话显示正常页面。

 

首先自然是安装nginx,改端口,反代。

配置文件如下 :

server {
  listen IP地址:80;
  error_page 403 /403.html;
  root /errmsg/;
  location = /403.html
  {
    root /errmsg/;
    allow all;
    internal;
  }
  location / {
    if ( $cookie_antiscanpassword != "password") {
      return 403;
    }
    proxy_pass http://127.0.0.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
  location = /antiscanpassword/cookie.js {
    alias /errmsg/antiscanpassword/cookie.js;
  }
  location ~*\.(jpg|png|jpeg|gif|js|css|flv|mp4|pdf)$ {
    proxy_pass http://127.0.0.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  } 
  index index.html index.htm;
}

建立/errmsg/403.html.内容如下:

<html>
<head>
<script src='/antiscanpassword/cookie.js'></script>
<script>
var login=function(){
  var date = new Date();
  date.setYear(date.getYear()+1);
  docCookies.setItem('antiscanpassword','password',Infinity,'/');
  if (docCookies.getItem('antiscanpassword')=='password')
  {
    location.reload(true);
  }
}
login();
</script>
</head>
<body>
</body>
</html>

 

建立 /antiscanpassword/cookie.js,内容见 https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie

然后就可以测试了。

nginx里负责判断cookie值,页面负责赋值和刷新。

对各种静态文件不做判断,方便站外应用。

上了一套后感觉测试服务器的内存占用有显著改善。

可以通过curl进行测试。

这个无法防止各种基于浏览器模拟器的爬虫/恶意程序。

但对于普通骚扰还是能提升点难度的。

发布于
2015-07-02