DNS 查询 - Domain Name Server

 1 DNS 查询 - Domain Name Server
 2     socket.getaddrinfo("www.baidu.com",None)
 3         返回时一个 tuple list - (family, sockettype, protocol, canonname, socketaddr)
 4         list 的没一个 tuple 元素是一个对应该 域名 host 的一个 web 服务器.
 5         # [(<AddressFamily.AF_INET: 2>, 0, 0, '', ('61.135.169.125', 0)), 
 6         #  (<AddressFamily.AF_INET: 2>, 0, 0, '', ('61.135.169.121', 0))]
 7 
 8 反向查询 - IP 到 hostname    
 9     socket.gethostbyaddr(addr)
10     因为 DNS 信息的授权方式,返回查询得到数据可能是伪造的. 对于反向查询授权是基于IP地址的,
11     所以 DNS 的组织结构中没有办法阻止这种欺骗, 但是可以在程序中做一个反向查找数据的真实性验证:
12         首先方向查找根据 IP 得到一个 hostname , 然后使用反向查询得到的 hostname 做正向查询,
13         如果得到的 IP 跟之前方向查找所用的 IP 一致即反向查到到的 hostname 是真实的,否者就是伪造的.
14         由于正向 DNS 查询是的授权信息是基于域名服务器的, 所以正常查询的信息无法被伪造.
15 
16 例子,
17     import sys, socket
18 
19     def getips(hostname):
20         res = socket.getaddrinfo(hostname, None, 0, socket.SOCK_STREAM)
21         ips = [i[4][0] for i in res]
22         return ips
23 
24     def gethostname(ip):
25         return socket.gethostbyaddr(ip)[0]
26 
27     try:
28         IP = ""
29         hostname = gethostname(IP)
30         ips = getips(hostname)
31     except socket.herror as e:
32         print("Hostname not available for : %s" % IP)
33         print(e)
34     except socket.gaierror as e:      # 询址错误
35         print("Hostname got : %s , however could not forward lookup the host with error : %S" % (hostname, str(e)))
36 
37     if IP not in ips:
38         print("Forward check failed about hostname : %s with IP: %s" % (hostname,IP))
39     else:
40         print("Validated hostname : %s " % hostname)
41 
42 环境信息相关,
43     socket.gethostname()
44         本地的 hostname
45     socket.getfqdn(hostname)
46         通过 hostname 获得 full hostname
47 
48     为了得到完整的域名和 IP 地址, 可以首先通过 gethostname() 方法获得 hostname,
49     接着 通过 getfqdn() 得到完成的信息 - full hostname. 最后使用 getaddrinfo()
50     来获得该域名对应的 IP 地址.
51 
52     例子,
53         import sys, socket
54         def getips(hostname):
55             res = socket.getaddrinfo(hostname, None, 0, socket.SOCK_STREAM)
56             ips = [i[4][0] for i in res]
57             return ips
58 
59         hostname = socket.gethostname()
60         print("hostname is : %s" % hostname)
61         fullhostname = socket.getfqdn(hostname)
62         print("full hostname is %s" % fullhostname)
63         try:
64             print("IP addrs :", ", ".join(getips(fullhostname)))
65         except socket.gaierror as e:
66             print("Could not get IP addr : ",e)

 

转载于:https://www.cnblogs.com/zzyzz/p/7986634.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值