| Server IP : 202.61.199.114 / Your IP : 216.73.217.139 Web Server : nginx/1.22.1 System : Linux de.arni-solutions.de 6.1.0-49-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64 User : web20 ( 1018) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/clients/client2/web21/web/api/lib/ |
Upload File : |
<?php
/**
* ASN-/Netzwerk-Auflösung via Team Cymru DNS (schnell, ohne Key) + RIPEstat-Fallback.
*
* @package SafeMyIdent\Api
*/
declare(strict_types=1);
require_once __DIR__ . '/net.php';
require_once __DIR__ . '/ripestat.php';
/**
* Team-Cymru-Origin-Lookup zu einer IP.
*
* @param string $ip IP.
* @return array{asn:string,prefix:string,cc:string,rir:string,date:string}
*/
function smi_cymru_origin(string $ip): array
{
$empty = ['asn' => '', 'prefix' => '', 'cc' => '', 'rir' => '', 'date' => ''];
$ver = smi_ip_version($ip);
if ($ver === 4) {
$rev = implode('.', array_reverse(explode('.', $ip)));
$q = $rev . '.origin.asn.cymru.com';
} elseif ($ver === 6) {
$bin = @inet_pton($ip);
if ($bin === false) {
return $empty;
}
$hex = bin2hex($bin);
$rev = implode('.', array_reverse(str_split($hex)));
$q = $rev . '.origin6.asn.cymru.com';
} else {
return $empty;
}
$recs = smi_dns($q, DNS_TXT);
if (!is_array($recs) || !isset($recs[0]['txt'])) {
return $empty;
}
// "ASN | Prefix | CC | RIR | Date" (bei mehreren ASNs: "AS1 AS2 | …")
$parts = array_map('trim', explode('|', (string) $recs[0]['txt']));
return [
'asn' => $parts[0] ?? '',
'prefix' => $parts[1] ?? '',
'cc' => $parts[2] ?? '',
'rir' => $parts[3] ?? '',
'date' => $parts[4] ?? '',
];
}
/**
* AS-Name via Team Cymru.
*
* @param string $asn ASN-Zahl.
* @return string AS-Name oder ''.
*/
function smi_cymru_asname(string $asn): string
{
$asn = preg_replace('/\D/', '', $asn);
if ($asn === '') {
return '';
}
$recs = smi_dns('AS' . $asn . '.asn.cymru.com', DNS_TXT);
if (!is_array($recs) || !isset($recs[0]['txt'])) {
return '';
}
// "ASN | CC | RIR | Date | AS-Name"
$parts = array_map('trim', explode('|', (string) $recs[0]['txt']));
return $parts[4] ?? '';
}
/**
* RIR aus Kürzel lesbar machen.
*
* @param string $rir Kürzel.
* @return string
*/
function smi_rir_name(string $rir): string
{
$map = [
'ripencc' => 'RIPE NCC (Europa/Naher Osten)', 'ripe' => 'RIPE NCC (Europa/Naher Osten)',
'arin' => 'ARIN (Nordamerika)', 'apnic' => 'APNIC (Asien/Pazifik)',
'lacnic' => 'LACNIC (Lateinamerika)', 'afrinic' => 'AFRINIC (Afrika)',
];
return $map[strtolower(trim($rir))] ?? strtoupper($rir);
}
/**
* Vollständige ASN-/Netz-Infos zu einer IP (Cymru + RIPEstat kombiniert).
*
* @param string $ip IP.
* @return array<string,mixed>
*/
function smi_asn_lookup(string $ip): array
{
$c = smi_cymru_origin($ip);
$firstAsn = trim(explode(' ', $c['asn'])[0]);
$name = $firstAsn !== '' ? smi_cymru_asname($firstAsn) : '';
// Ergänzen/absichern via RIPEstat.
if ($firstAsn === '' || $c['prefix'] === '') {
$ni = smi_ripe_network_info($ip);
if ($firstAsn === '' && !empty($ni['asns'])) {
$firstAsn = (string) $ni['asns'][0];
}
if ($c['prefix'] === '') {
$c['prefix'] = $ni['prefix'];
}
}
if ($name === '' && $firstAsn !== '') {
$ov = smi_ripe_as_overview($firstAsn);
$name = $ov['holder'];
}
return [
'asn' => $firstAsn !== '' ? 'AS' . $firstAsn : '',
'asn_number' => $firstAsn,
'as_name' => $name,
'prefix' => $c['prefix'],
'cc' => $c['cc'],
'rir' => $c['rir'],
'rir_name' => $c['rir'] !== '' ? smi_rir_name($c['rir']) : '',
'alloc_date' => $c['date'],
];
}