网上有一些拿着个开源的爬虫到处爬行网站,发现漏洞攻击。很长时间一直没想到好的方式解决爬虫问题。
前段时间想到给页面加钓鱼链接。正常程序不会加载链接,如果有爬虫行为,那么爬虫会请求加载这些链接的资源。那么就可以对这些行为进行拉黑操作。借助dotnetcore的AuthorizeStaticFilesMiddleware静态文件审核中间件,拉黑的客户端不响应资源。以此解决爬虫爬行问题,发现和中断爬虫。此为被动防御策略。
那么有什么主动策略呢?比如爬虫爬行直接用病毒入侵爬行电脑之类的。经过我长期思考终于找到一种主动策略,主动发现爬虫进程杀死。
从上图的cmd发现了什么?
cmd可以发现某个端口被哪些进程使用。
C:\Users\zhanglianzhu>netstat -ano | findstr "18082"
TCP 0.0.0.0:18082 0.0.0.0:0 LISTENING 4
TCP 127.0.0.1:18082 127.0.0.1:59314 ESTABLISHED 4
TCP 127.0.0.1:59314 127.0.0.1:18082 ESTABLISHED 33420
TCP [::]:18082 [::]:0 LISTENING 4
C:\Users\zhanglianzhu>tasklist|findstr 33420
chrome.exe 33420 Console 6 33,972 K
这就给反爬虫带来一个切入点。可以在自己的客户端程序发布一个http服务。在自己网站加一些连接和请求执行本地127的http服务。在http服务处理里面通过cmd找到访问该http服务的进程,如果不是浏览器,那么就是爬虫,就杀进程。
C#实现大概就是下面这个样子
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
namespace LIS.MsgCore
{
/// <summary>
/// 得到访问端口的进程
/// </summary>
public class GetPortProcessUtil
{
/// <summary>
/// 得到访问端口的进程
/// </summary>
/// <param name="port"></param>
/// <returns></returns>
public static List<string> GetPortProcess(string port)
{
List<string> ret = new List<string>();
//查找端口信息
List<string> retList=Run("netstat -ano | findstr \""+ port + "\"");
if(retList!=null&& retList.Count>0)
{
foreach(var v in retList)
{
string perLine = MergeSpace(v);
string[] arr = perLine.Split('^');
if (arr.Length>5&& arr[3].Contains("127.0.0.1:"+ port))
{
string pid = arr[5];
//查找进程信息
List<string> proList=Run("tasklist|findstr "+ pid);
if(proList!=null&& proList.Count>0)
{
foreach(var v1 in proList)
{
string proLine = MergeSpace(v1);
string[] proArr = proLine.Split('^');
if(proArr.Length>5)
{
ret.Add(proLine.Split('^')[0]);
}
}
}
}
}
}
return ret;
}
/// <summary>
/// 通过名称结束进程
/// </summary>
/// <param name="list"></param>
public static void KillProcessByName(List<string> list)
{
if(list!=null&& list.Count>0)
{
foreach(var v in list)
{
//非谷歌访问就杀进程
if(v!="chrome.exe")
{
//杀掉进程
foreach (Process p in System.Diagnostics.Process.GetProcessesByName(v.Split('.')[0]))
{
try
{
p.Kill();
p.WaitForExit();
}
catch (Exception exp)
{
}
}
}
}
}
}
/// <summary>
/// 合并空格
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private static string MergeSpace(string str)
{
if (!string.IsNullOrEmpty(str))
{
str = new System.Text.RegularExpressions.Regex("[\\s]+").Replace(str, "^");
}
return str;
}
/// <summary>
/// 运行cmd
/// </summary>
/// <param name="cmd">命令</param>
/// <returns></returns>
private static List<string> Run(string cmd)
{
Process process1 = new Process();
process1.StartInfo.FileName = "cmd.exe";
process1.StartInfo.UseShellExecute = false;
process1.StartInfo.RedirectStandardInput = true;
process1.StartInfo.RedirectStandardOutput = true;
process1.StartInfo.RedirectStandardError = true;
process1.StartInfo.CreateNoWindow = true;
Process process = process1;
process.Start();
cmd = string.IsNullOrEmpty(cmd) ? "exit" : (cmd + " & exit");
process.StandardInput.WriteLine(cmd);
process.StandardInput.AutoFlush = true;
List<string> retList = new List<string>();
//读取标准输出
using (var sr = process.StandardOutput)
{
while (!sr.EndOfStream)
{
retList.Add(sr.ReadLine());
}
}
return retList;
}
}
}
在自己客户端程序发布http服务额。服务里面反追踪爬虫杀掉。网站随意加访问客户端http资源的链接给爬虫准备。