0%

Sqlmap源码-checkSameHost函数的疑问

Pre:

在看sqlmap源码的时候,看了它的crawler,用到了checkSameHost函数.

跟进到lib.core.common公共函数里看checkSameHost函数,产生了一些疑问


checkSameHost函数:

函数作用

用来判断一堆urls是否是相同主机的.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def checkSameHost(*urls):
"""
Returns True if all provided urls share that same host
>>> checkSameHost('http://www.target.com/page1.php?id=1', 'http://www.target.com/images/page2.php')
True
>>> checkSameHost('http://www.target.com/page1.php?id=1', 'http://www.target2.com/images/page2.php')
False
"""
# 用了*urls可以接受任意数量的参数,并放入tuple里,由于不知道传入url的个数是多少,所以要适当的进行判断
if not urls:
return None
elif len(urls) == 1: # 1个url不用判断
return True
else:
def _(value): # _ 这个用法应该是匿名函数的意思吧?
if value and not re.search(r"\A\w+://", value):
# \A 文本开头
# \w匹配英文字母、数字或下划线,等价于[a-zA-Z0-9_]。
# + 量词 — 匹配 1 至 无穷 次
# :// 字面匹配字符
value = "http://%s" % value # 没有协议的话自动加上http协议.这个判断可用来处理输入时有没带协议的情况,方便urlparse.urlparse函数进行解析
return value
return all(re.sub(r"(?i)\Awww\.", "", urlparse.urlparse(_(url) or "").netloc.split(':')[0]) == re.sub(
r"(?i)\Awww\.", "", urlparse.urlparse(_(urls[0]) or "").netloc.split(':')[0]) for url in urls[1:])
# all(iterable) Return True if all elements of the iterable are true (or if the iterable is empty)
# urlparse.urlparse(_(url) or "").netloc.split(':')[0] 域名服务器
# 正则表达式 r"(?i)\Awww\." (?!) Assert that the Regex below does not match
# www.开头的域名,www.baidu.com会被处理成baidu.com
# 遍历看,通过域名判断是否是sameHost

测试:

  • http://www.target.com/page1.php?id=1, http://www.target.com/images/page2.php

    • True
  • http://www.target.com/page1.php?id=1, http://www.target2.com/images/page2.php

    • False
  • http://xxx.com,http://www.xxx.com

    • True
  • http://aa.xxx.com,http://bb.xxx.com

    • False
    • ???

疑问:

很多时候,http://aa.xxx.com,http://bb.xxx.com这两个子域名是可以解析同一个ip上的,这种情况下sameHost判断应该为True才对,为什么这里为False呢?

answer:

这里的sameHost应该是有歧义严格意义上,是否是sameHost应该通过ip来判断,但是如果url很多的话,都去其解析域名对应的ip,会消耗时间

广义上看,这里的sameHost应该指的是same website.

通过域名来判断是否是相同的网站,是ok的.


域名与ip的关系:

常见的情况下,一个域名与一个ip是对应的.

但是域名与ip的关系不一定是一对一的关系,可以是多对一或者是一对多的关系.