• 批量检测url是否存在cdn—高准确率


    看了网上对url批量检测cdn的脚本没有多少也不准确,这里写一下

    一般判断cdn的方法如下

    全球ping

    显示的ip地址超过一个则使用了cdn,这是最靠谱的方法

    nslookup

    1. nslookup默认解析

    使用 "nslookup 域名",如果目标有CDN服务的话,那么“非权威应答”中的“addresses”中的IP数 >=2个,但是也会有误报

    2. 不同DNS域名解析

    不同DNS域名解析情况对比,判断其是否使用了CDN。不同DNS解析结果若不一样,很有可能存在CDN服务

    所以我们可以根据这两点来判断是否使用了cdn

    批量检测脚本

    如果引用全球ping的api接口进行检测,那检测效率会受限于服务器网速以及可能遇到被封ip的风险。这里使用nslookup进行多次检测,以确认是否使用cdn,准确率99%

    cdn.py

    1. from subprocess import PIPE, Popen
    2. import re
    3. import os
    4. from colorama import init,Fore
    5. init(autoreset=True)
    6. import argparse
    7. def args():
    8. parser = argparse.ArgumentParser(description='cdn批量检测脚本')
    9. parser.add_argument('-f',type=str,help='批量检测,请将url放在txt文档中,一个一行')
    10. args = parser.parse_args()
    11. ssrc = """
    12. ______ _____________ ____
    13. / ___/ / ___/\_ __ \_/ ___\
    14. \___ \ \___ \ | | \/\ \___
    15. /____ >/____ > |__| \___ >
    16. \/ \/ \/
    17. Author: 山山而川
    18. """
    19. print(ssrc)
    20. if args.f:
    21. filename = args.f
    22. if os.path.exists(filename):
    23. check_cdn(filename)
    24. else:
    25. print("输入的文件名不存在!")
    26. def check_cdn(filename):
    27. result_list = []
    28. for url in open(filename,'r'):
    29. url = url.replace("\n","")
    30. ip = url.replace("http://","").replace("https://","").replace("/","").replace("\n","")
    31. proc = Popen('nslookup %s' %(ip),stdin=None,stdout=PIPE,stderr=PIPE,shell=True)
    32. outinfo, errinfo = proc.communicate()
    33. info = outinfo.decode('gbk')
    34. ip_list = re.findall(r"\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}",info,re.S)
    35. if len(ip_list) >= 3:
    36. print(Fore.RED+"[-]",url," 存在cdn")
    37. continue
    38. if len(ip_list) == 1:
    39. print(Fore.BLUE+"[-]",url," 请求超时")
    40. continue
    41. if len(ip_list) == 2:
    42. #二次判断,提高准确率
    43. proc = Popen('nslookup %s 223.5.5.5' %(ip),stdin=None,stdout=PIPE,stderr=PIPE,shell=True)
    44. outinfo, errinfo = proc.communicate()
    45. info1 = outinfo.decode('gbk')
    46. ip_list1 = re.findall(r"\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}",info1,re.S)
    47. if len(ip_list1) >= 3:
    48. print(Fore.RED+"[-]",url," 存在cdn")
    49. continue
    50. if len(ip_list1) ==2:
    51. name1 = re.findall(r'名称:.*Address:.*?(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})',info,re.S)[0]
    52. name2 = re.findall(r'名称:.*Address:.*?(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})',info1,re.S)[0]
    53. if name1 != name2:
    54. print(Fore.RED+"[-]",url," 存在cdn")
    55. continue
    56. if name1 == name2:
    57. print(Fore.GREEN+"[+] %s 不存在cdn \t真实ip: %s" %(url,name2))
    58. result_list.append(name2)
    59. lis = list(set(result_list))
    60. if len(lis):
    61. for r in lis:
    62. with open("result.txt",'a') as f:
    63. f.write(r+"\n")
    64. print("检测完毕,不存在cdn的url ip保存在当前路径'result.txt'")
    65. if not len(lis):
    66. print("检测完毕!")
    67. if __name__ == '__main__':
    68. args()
  • 相关阅读:
    2021年50道Java线程面试题
    c++ 图论学习3
    Tcl语言:基础入门(一)
    表的增删查改
    【面试题】什么是事务,什么是脏读、不可重复读、幻读,以及MySQL的几种事务隔离级别的应对方法
    并发内存池(C++)
    maven的.m2文件夹
    数据类型概括
    Java:泛型
    支持宏的文本编辑器提高生产力
  • 原文地址:https://blog.csdn.net/qq_44159028/article/details/125557289