From 2390787863898ed6b6b81c53844fe6850360eff6 Mon Sep 17 00:00:00 2001 From: xljiulang <366193849@qq.com> Date: Thu, 17 Jun 2021 22:34:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ipaddress.com=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E8=80=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DnsDomainAddressProvider.cs | 4 +- .../IPAddressComDomainAddressProvider.cs | 90 +++++++++++++++++++ .../MetaDomainAddressProvider.cs | 2 +- FastGithub.Scanner/GithubOptions.cs | 39 ++++---- FastGithub/appsettings.json | 60 +++++++------ 5 files changed, 152 insertions(+), 43 deletions(-) create mode 100644 FastGithub.Scanner/DomainAddressProviders/IPAddressComDomainAddressProvider.cs diff --git a/FastGithub.Scanner/DomainAddressProviders/DnsDomainAddressProvider.cs b/FastGithub.Scanner/DomainAddressProviders/DnsDomainAddressProvider.cs index e81787a..1451d19 100644 --- a/FastGithub.Scanner/DomainAddressProviders/DnsDomainAddressProvider.cs +++ b/FastGithub.Scanner/DomainAddressProviders/DnsDomainAddressProvider.cs @@ -17,7 +17,7 @@ namespace FastGithub.Scanner.DomainMiddlewares private readonly ILogger logger; public DnsDomainAddressProvider( - IOptionsMonitor options, + IOptionsMonitor options, ILogger logger) { this.options = options; @@ -26,7 +26,7 @@ namespace FastGithub.Scanner.DomainMiddlewares public async Task> CreateDomainAddressesAsync() { - var setting = this.options.CurrentValue.DnsDomainAddress; + var setting = this.options.CurrentValue.DominAddressProvider.DnsDomainAddress; if (setting.Enable == false) { return Enumerable.Empty(); diff --git a/FastGithub.Scanner/DomainAddressProviders/IPAddressComDomainAddressProvider.cs b/FastGithub.Scanner/DomainAddressProviders/IPAddressComDomainAddressProvider.cs new file mode 100644 index 0000000..ef398df --- /dev/null +++ b/FastGithub.Scanner/DomainAddressProviders/IPAddressComDomainAddressProvider.cs @@ -0,0 +1,90 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace FastGithub.Scanner.DomainMiddlewares +{ + [Service(ServiceLifetime.Singleton, ServiceType = typeof(IDomainAddressProvider))] + sealed class IPAddressComDomainAddressProvider : IDomainAddressProvider + { + private readonly IOptionsMonitor options; + private readonly ILogger logger; + private readonly Uri lookupUri = new("https://www.ipaddress.com/ip-lookup"); + + public IPAddressComDomainAddressProvider( + IOptionsMonitor options, + ILogger logger) + { + this.options = options; + this.logger = logger; + } + + public async Task> CreateDomainAddressesAsync() + { + var setting = this.options.CurrentValue.DominAddressProvider.IPAddressComDomainAddress; + if (setting.Enable == false) + { + return Enumerable.Empty(); + } + + using var httpClient = new HttpClient(); + var result = new List(); + foreach (var domain in setting.Domains) + { + try + { + var addresses = await this.LookupAsync(httpClient, domain); + foreach (var address in addresses) + { + result.Add(new DomainAddress(domain, address)); + } + } + catch (Exception) + { + this.logger.LogWarning($"ipaddress.com无法解析{domain}"); + } + } + return result; + } + + private async Task> LookupAsync(HttpClient httpClient, string domain) + { + var keyValue = new KeyValuePair("host", domain); + var content = new FormUrlEncodedContent(Enumerable.Repeat(keyValue, 1)); + var request = new HttpRequestMessage + { + Method = HttpMethod.Post, + RequestUri = lookupUri, + Content = content + }; + + var response = await httpClient.SendAsync(request); + var html = await response.Content.ReadAsStringAsync(); + var match = Regex.Match(html, @"(?<=

IP Lookup : )\d+\.\d+\.\d+\.\d+", RegexOptions.IgnoreCase); + + if (match.Success && IPAddress.TryParse(match.Value, out var address)) + { + return new List { address }; + } + + var prefix = Regex.Escape("type=\"radio\" value=\""); + var matches = Regex.Matches(html, @$"(?<={prefix})\d+\.\d+\.\d+\.\d+", RegexOptions.IgnoreCase); + var addressList = new List(); + foreach (Match item in matches) + { + if (IPAddress.TryParse(item.Value, out address)) + { + addressList.Add(address); + } + } + return addressList; + } + } +} diff --git a/FastGithub.Scanner/DomainAddressProviders/MetaDomainAddressProvider.cs b/FastGithub.Scanner/DomainAddressProviders/MetaDomainAddressProvider.cs index 3507ce3..de019e9 100644 --- a/FastGithub.Scanner/DomainAddressProviders/MetaDomainAddressProvider.cs +++ b/FastGithub.Scanner/DomainAddressProviders/MetaDomainAddressProvider.cs @@ -28,7 +28,7 @@ namespace FastGithub.Scanner.DomainMiddlewares public async Task> CreateDomainAddressesAsync() { - var setting = this.options.CurrentValue.MetaDomainAddress; + var setting = this.options.CurrentValue.DominAddressProvider.MetaDomainAddress; if (setting.Enable == false) { return Enumerable.Empty(); diff --git a/FastGithub.Scanner/GithubOptions.cs b/FastGithub.Scanner/GithubOptions.cs index 76bbdb8..f56ad8c 100644 --- a/FastGithub.Scanner/GithubOptions.cs +++ b/FastGithub.Scanner/GithubOptions.cs @@ -1,7 +1,5 @@ using System; - - namespace FastGithub.Scanner { [Options("Github")] @@ -9,9 +7,7 @@ namespace FastGithub.Scanner { public ScanSetting Scan { get; set; } = new ScanSetting(); - public MetaDoaminAddressSetting MetaDomainAddress { get; set; } = new MetaDoaminAddressSetting(); - - public DnsDomainAddressSetting DnsDomainAddress { get; set; } = new DnsDomainAddressSetting(); + public DomainAddressProviderSetting DominAddressProvider { get; set; } = new DomainAddressProviderSetting(); public class ScanSetting { @@ -24,21 +20,34 @@ namespace FastGithub.Scanner public TimeSpan HttpsScanTimeout { get; set; } = TimeSpan.FromSeconds(2d); } - - public class MetaDoaminAddressSetting + public class DomainAddressProviderSetting { - public bool Enable { get; set; } = true; + public DnsDomainAddressSetting DnsDomainAddress { get; set; } = new DnsDomainAddressSetting(); + public MetaDoaminAddressSetting MetaDomainAddress { get; set; } = new MetaDoaminAddressSetting(); + public IPAddressComDomainAddressSetting IPAddressComDomainAddress { get; set; } = new IPAddressComDomainAddressSetting(); - public Uri MetaUri { get; set; } = new Uri("https://gitee.com/jiulang/fast-github/raw/master/FastGithub/meta.json"); - } + public class DnsDomainAddressSetting + { + public bool Enable { get; set; } = true; - public class DnsDomainAddressSetting - { - public bool Enable { get; set; } = true; + public string[] Dnss { get; set; } = Array.Empty(); - public string[] Dnss { get; set; } = Array.Empty(); + public string[] Domains { get; set; } = Array.Empty(); + } - public string[] Domains { get; set; } = Array.Empty(); + public class MetaDoaminAddressSetting + { + public bool Enable { get; set; } = true; + + public Uri MetaUri { get; set; } = new Uri("https://gitee.com/jiulang/fast-github/raw/master/FastGithub/meta.json"); + } + + public class IPAddressComDomainAddressSetting + { + public bool Enable { get; set; } = true; + + public string[] Domains { get; set; } = Array.Empty(); + } } } } diff --git a/FastGithub/appsettings.json b/FastGithub/appsettings.json index 78457a3..fd19c75 100644 --- a/FastGithub/appsettings.json +++ b/FastGithub/appsettings.json @@ -10,31 +10,41 @@ "TcpScanTimeout": "00:00:01", // tcpɨ賬ʱʱ "HttpsScanTimeout": "00:00:02" // httpsɨ賬ʱʱ }, - "MetaDomainAddress": { - "Enable": true, - "MetaUri": "https://gitee.com/jiulang/fast-github/raw/master/FastGithub/meta.json" // metaԴuri - }, - "DnsDomainAddress": { - "Enable": true, - "Dnss": [ - "119.29.29.29", - "180.76.76.76", - "8.8.8.8", - "8.8.4.4", - "114.114.114.114", - "114.114.115.115", - "223.5.5.5", - "223.6.6.6", - "1.2.4.8", - "210.2.4.8", - "208.67.220.220", - "208.67.222.222" - ], - "Domains": [ - "github.com", - "api.github.com", - "github.githubassets.com" - ] + "DominAddressProvider": { + "MetaDomainAddress": { + "Enable": true, + "MetaUri": "https://gitee.com/jiulang/fast-github/raw/master/FastGithub/meta.json" // metaԴuri + }, + "IPAddressComDomainAddress": { + "Enable": true, + "Domains": [ + "github.com", + "api.github.com", + "github.githubassets.com" + ] + }, + "DnsDomainAddress": { + "Enable": true, + "Dnss": [ + "119.29.29.29", + "180.76.76.76", + "8.8.8.8", + "8.8.4.4", + "114.114.114.114", + "114.114.115.115", + "223.5.5.5", + "223.6.6.6", + "1.2.4.8", + "210.2.4.8", + "208.67.220.220", + "208.67.222.222" + ], + "Domains": [ + "github.com", + "api.github.com", + "github.githubassets.com" + ] + } } }, "Logging": {