徐松亮Python教学-黑客篇-根据IP地址获取地理位置(初级篇)

版权声明:本文为博主徐松亮的原创作品,未经允许不得转载,多谢支持!QQ:5387603

推荐点击此链接:欢迎进入徐松亮博客一站式导航搜索(随时更新)


目录

一,概念

场景

场景解决

具体方案

数据到哪去查呢?

本文用什么变成语言?

本文用GeoLiteCity的在线查询还是离线查询?

离线数据源的定期更新

二,准备工作

python环境

安装MaxMind公司的开源数据库GeoLiteCity:

三,代码讲解

四,源码

五,运行效果

六,调试记录


一,概念

  • 场景

    • 如果遇到服务器被攻击,恶意链接,我们怎样调查呢?
    • 反过来如果我们是黑客,怎么躲避调查呢?
  • 场景解决

    • 目前比较常见的方法就是根据IP地址来定位服务器的位置.
  • 具体方案

    • 本教程就为大家介绍怎样根据IP地址来定位攻击服务器的位置.
  • 数据到哪去查呢?

    • 这里我们用MaxMind的GeoLiteCity数据库,为什么选它呢?
      • 因为它有免费开源的版本来让我们不用花钱来做这个事.
      • 如果要更专业更精准的定位服务,MaxMind还有一些收费的商业版可供购买.
    • GeoLiteCity可以在线查询,也可以把离线数据下载到本机查询,很不错.
    • 要使用GeoLiteCity的数据,用什么编程语言呢?
      • 它支持好多语言,官方C#/C/JAVA/Perl/PHP/Python/等,还有第三方支持更多其他语言,具体见官方文档。
  • 本文用什么变成语言?

    • 上面也说到数据库支持很多编程语言,在此,我们用python
  • 本文用GeoLiteCity的在线查询还是离线查询?

    • 在线方式优缺点
      • 优点:不用定期更新数据包
      • 缺点:查询总要依靠MaxMind服务器,万一网络数据链路或服务器出问题则失效。
    • 离线方式的优缺点
      • 优点:数据库在本地,就是让人感觉到放心。
      • 缺点:需要定期更新数据包
    • 本文用离线查询方式。在线方式应用更简单,使用看官方技术文档即可(下一章节有网址)
  • 离线数据源的定期更新

    • GeoLiteCity如果在linux环境下,提供自动更新数据库的脚本,但是windows下没有,只能手动周期更新下载。但我认为是可以自己写一个脚本的,无非就是从网站上下载保存到指令路径让系统周期性运行而已。

二,准备工作

三,代码讲解

  • 本文主要介绍City库的应用,其他应用请自行看手册.

四,源码

#!D:/Program Files/Python37/python
import geoip2.database

# This creates a Reader object. You should use the same object
# across multiple requests as creation of it is expensive.
reader = geoip2.database.Reader(
    '../../../xsl_use_lib/geolite2/GeoLite2-City/GeoLite2-City.mmdb')

def ip_print_AddrInfo(ip):
    # Replace "city" with pthe method corresponding to the database
    # that you are using, e.g., "country".
    #-----------------------------------------------
    # 载入指定IP相关数据
    response = reader.city(ip)
    #读取国家代码
    Country_IsoCode = response.country.iso_code
    #读取国家名称
    Country_Name = response.country.name
    #读取国家名称(中文显示)
    Country_NameCN = response.country.names['zh-CN']
    #读取州(国外)/省(国内)名称
    Country_SpecificName = response.subdivisions.most_specific.name
    #读取州(国外)/省(国内)代码
    Country_SpecificIsoCode = response.subdivisions.most_specific.iso_code
    #读取城市名称
    City_Name = response.city.name
    #读取邮政编码
    City_PostalCode = response.postal.code
    #获取纬度
    Location_Latitude = response.location.latitude
    #获取经度
    Location_Longitude = response.location.longitude
    #------------------------------------------------打印
    print('[*] Target: ' + ip + ' GeoLite2-Located ')
    print('  [+] Country_IsoCode        : ' + Country_IsoCode)
    print('  [+] Country_Name           : ' + Country_Name)
    print('  [+] Country_NameCN         : ' + Country_NameCN)
    print('  [+] Country_SpecificName   : ' + Country_SpecificName)
    print('  [+] Country_SpecificIsoCode: ' + Country_SpecificIsoCode)
    print('  [+] City_Name              : ' + City_Name)
    if City_PostalCode != None:
        print('  [+] City_PostalCode        : ' + City_PostalCode)
    print('  [+] Location_Latitude      : ' + str(Location_Latitude))
    print('  [+] Location_Longitude     : ' + str(Location_Longitude))

ip = '119.108.116.209'
ip_print_AddrInfo(ip)

五,运行效果

六,调试记录

  • 对于一些经过各种网络路由设备转换过的IP未必好使。
  • 数据库视乎缺少中国的相关的邮政编码信息,导致运行出错,尝试美国IP没有此问题,所以在源码中加了条件容错。
  • 遇到如下问题:在python官方IDE运行好使,但是在VSCode环境下运行找不到geoip2,也就是运行import geoip2出错,猜想一定是VSCode哪里没用明白。
    • 问题原因:
      • 电脑中存在多个版本的python,两个环境的各种环境变量设置不一样
      • sys.path打印出来的内容都不一样(怎么能一样,后续再研究吧)
    • 解决方案:
      • 删除了不用的python版本
      • 在VSVode中启动了用户级的setting.json设置,把真正的python相关路径加入设置,才解决问题
    • 并已经把更新记录到了本人的VSCode简历python开发环境文档中
发布了28 篇原创文章 · 获赞 81 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xslxhn/article/details/83867949
今日推荐