主动反爬虫

网上有一些拿着个开源的爬虫到处爬行网站,发现漏洞攻击。很长时间一直没想到好的方式解决爬虫问题。

前段时间想到给页面加钓鱼链接。正常程序不会加载链接,如果有爬虫行为,那么爬虫会请求加载这些链接的资源。那么就可以对这些行为进行拉黑操作。借助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资源的链接给爬虫准备。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小乌鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值