首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅匹配域名中最左侧的通配符- Python

仅匹配域名中最左侧的通配符- Python
EN

Stack Overflow用户
提问于 2016-03-06 06:15:19
回答 3查看 970关注 0票数 1

我正在尝试为域名中最左边的通配符编写正则表达式。到目前为止,我有这样的想法:

代码语言:javascript
复制
import re
    o = urlparse(argv[1])
host_name = o.netloc
context = SSL.Context(SSL.TLSv1_METHOD) # Use TLS Method
context.set_options(SSL.OP_NO_SSLv2) # Don't accept SSLv2
context.set_verify(SSL.VERIFY_PEER | SSL.VERIFY_FAIL_IF_NO_PEER_CERT,
                   callback)
# context.load_verify_locations(ca_file, ca_path)

sock = socket()
ssl_sock = SSL.Connection(context, sock)
ssl_sock.connect((host_name, 443))
ssl_sock.set_connect_state()
ssl_sock.set_tlsext_host_name(host_name)
ssl_sock.do_handshake()

cert = ssl_sock.get_peer_certificate()
common_name = cert.get_subject().commonName.decode()
print "Common Name: ", common_name
print "Cert number: ", cert.get_serial_number()
regex = common_name.replace('.', r'\.').replace('*',r'.*') + '$'
if re.match(regex, host_name):
    print "matches"
else:
    print "invalid"

# output:
Common Name:  *.example.com
Cert number:  63694395280496902491340707875731768741

但是,正则表达式不仅匹配*.example.com,还匹配*.*.*www.*.com。此外,不应允许https://wrong.host.example.com/匹配。如何确保它只与最左边的标签匹配?

EN

回答 3

Stack Overflow用户

发布于 2016-03-06 06:43:32

您可以使用urlparse和split来代替regex。

代码语言:javascript
复制
from urlparse import urlparse
.
.
common_name = cert.get_subject().commonName.decode()
domain = urlparse(common_name).netloc
host = domain.split('.',1)[0]
票数 0
EN

Stack Overflow用户

发布于 2016-03-06 09:27:10

你可以试试这个正则表达式:

代码语言:javascript
复制
r'(?:^|\s)(\w+\.)?example\.com(?:$|\s)'

完整演示:

代码语言:javascript
复制
sock = socket()
ssl_sock = SSL.Connection(context, sock)
ssl_sock.connect((host_name, 443))
ssl_sock.set_connect_state()
ssl_sock.set_tlsext_host_name(host_name)
ssl_sock.do_handshake()

cert = ssl_sock.get_peer_certificate()
common_name = cert.get_subject().commonName.decode()
print "Common Name: ", common_name
print "Cert number: ", cert.get_serial_number()

rxString = r'(?:^|\s)(\w+\.)?' + common_name.replace('.', '\.')[3:] + '(?:$|\s)'
regex = re.compile(rxString)

if regex.match(host_name):
    print "matches"
else:
    print "invalid"

输入:

代码语言:javascript
复制
url                
-------------------
www.example.com    
example.com        
hello.example.com  
foo.bar.example.com
*.*.*              
www.*.com          

输出:

代码语言:javascript
复制
url                  |  result
-------------------  |  -----------
www.example.com      |  matches
example.com          |  matches
hello.example.com    |  matches
foo.bar.example.com  |  invalid
*.*.*                |  invalid
www.*.com            |  invalid
票数 0
EN

Stack Overflow用户

发布于 2020-11-11 00:18:30

不幸的是,在Saleem的回答中,Regexp是错误的,并且不符合RFC61256.4.3。

  1. 'example.com‘和'.example.com’都不能匹配。
  2. 可以使用如下通配符:字符串前后不能有任何空格(\s)字符。

我认为,最好的方法是将'*‘字符改为'^.+’(或者'^.*‘--不管f.example.com是否与f*.example.com匹配,RFC都是不干净的):

代码语言:javascript
复制
rxString = '^'+common_name.replace('.','\.').replace('*','[^\.]+')+'$'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35820618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档