Fix: улучшена фильтрация не-отелей, поддержка PDF-политики, исправлены ошибки DNS
This commit is contained in:
1 parent
928637ad25
commit
7fb417dad5
10 files changed
+240
-42
No files matched your search
@@ -5,6 +5,9 @@
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import socket
|
||||
from urllib.parse import urlparse
|
||||
|
||||
from playwright.async_api import Page
|
||||
|
||||
from scanner.checks.base import BaseCheck
|
||||
@@ -20,65 +23,43 @@ class ServerLocationCheck(BaseCheck):
|
||||
risk_on_fail = RiskLevel.CRITICAL
|
||||
default_weight = 25
|
||||
|
||||
# Популярные иностранные провайдеры (можно расширять)
|
||||
# Популярные русские DNS-серверы/хостеры
|
||||
RUSSIAN_HOSTERS = [
|
||||
"yandex", "mail.ru", "vk", "selectel", "timeweb", "beget",
|
||||
"reg.ru", "nic.ru", "rtcdn", "astra", "sbercloud",
|
||||
"cloud4russia", "гостех", "ростелеком", "мтс", "билайн",
|
||||
"мегафон", "вымпелком", "ростелеком", "netology",
|
||||
"мегафон", "вымпелком", "netology",
|
||||
"yandex.net", "mail.ru", "vk.com", "selectel.cloud",
|
||||
]
|
||||
|
||||
async def check(self, page: Page, url: str) -> CheckResult:
|
||||
try:
|
||||
# Получаем IP-адрес сервера через JavaScript
|
||||
ip_info = await page.evaluate("""() => {
|
||||
return new Promise((resolve) => {
|
||||
// Пробуем определить IP через несколько методов
|
||||
const methods = [
|
||||
() => fetch('https://api.ipify.org?format=json')
|
||||
.then(r => r.json()).then(d => ({ip: d.ip, method: 'ipify'})),
|
||||
() => fetch('https://api.my-ip.io/v2/json')
|
||||
.then(r => r.json()).then(d => ({ip: d.ip, method: 'my-ip-io'})),
|
||||
];
|
||||
# Извлекаем домен из URL
|
||||
parsed = urlparse(url)
|
||||
hostname = parsed.hostname or ""
|
||||
|
||||
if not hostname:
|
||||
return self._skip_result(message="Не удалось извлечь домен из URL.")
|
||||
|
||||
// Пробуем каждый метод
|
||||
(async () => {
|
||||
for (const method of methods) {
|
||||
try {
|
||||
const result = await method();
|
||||
resolve(result);
|
||||
return;
|
||||
} catch (e) {}
|
||||
}
|
||||
resolve(null);
|
||||
})();
|
||||
});
|
||||
}""")
|
||||
# Получаем IP через DNS
|
||||
try:
|
||||
ip = socket.gethostbyname(hostname)
|
||||
except socket.gaierror:
|
||||
return self._skip_result(message=f"Не удалось разрешить DNS для {hostname}.")
|
||||
|
||||
if not ip_info:
|
||||
return self._skip_result(
|
||||
message="Не удалось определить IP-адрес сервера.",
|
||||
)
|
||||
|
||||
ip = ip_info.get("ip", "")
|
||||
method = ip_info.get("method", "")
|
||||
|
||||
# Определяем страну по IP (используем публичный API)
|
||||
# Определяем страну по IP
|
||||
country = await self._get_country(ip)
|
||||
|
||||
if not country:
|
||||
return self._skip_result(
|
||||
message=f"Не удалось определить страну для IP {ip}.",
|
||||
)
|
||||
return self._skip_result(message=f"Не удалось определить страну для IP {ip}.")
|
||||
|
||||
# Проверяем, Россия ли это
|
||||
if country.lower() == "ru" or "Россия" in country:
|
||||
if country.lower() == "ru" or "Россия" in country or "russia" in country.lower():
|
||||
return self._pass_result(
|
||||
message=f"Сервер находится в России (IP: {ip}, Страна: {country})",
|
||||
details={
|
||||
"ip": ip,
|
||||
"country": country,
|
||||
"method": method,
|
||||
},
|
||||
)
|
||||
|
||||
@@ -91,7 +72,6 @@ class ServerLocationCheck(BaseCheck):
|
||||
details={
|
||||
"ip": ip,
|
||||
"country": country,
|
||||
"method": method,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
Reference in new issue
Block a user