Start · Sprachen · PHP · Referenz · radius_get_vendor_attr

radius_get_vendor_attr

Funktion

Extrahiert aus einem rohen Datenpuffer ein herstellerspezifisches RADIUS-Attribut (Vendor-Specific Attribute, VSA) und gibt seine Bestandteile zurück.

seit PHP pecl_radius Kategorie: misc

Signatur

radius_get_vendor_attr(string $data): array|false

Beschreibung

radius_get_vendor_attr() analysiert einen rohen Datenpuffer, der einen herstellerspezifischen RADIUS-Attributwert enthält, und zerlegt ihn in seine drei Bestandteile: Vendor-ID, Attribut-Typ und Attribut-Wert. Die Funktion wird typischerweise eingesetzt, nachdem radius_get_attr() ein Attribut vom Typ RADIUS_VENDOR_SPECIFIC (Typ 26) zurückgegeben hat.

Im RADIUS-Protokoll ermöglichen Vendor-Specific Attributes (VSAs) Herstellern wie Cisco, Juniper oder Microsoft, eigene, nicht standardisierte Attribute zu übertragen. Der rohe Inhalt eines solchen Attributs enthält kodiert die Vendor-ID sowie die eigentlichen Sub-Attribute, die erst durch diese Funktion sinnvoll interpretiert werden können.

Der typische Arbeitsablauf ist: radius_get_attr() in einer Schleife aufrufen, prüfen ob der Typ RADIUS_VENDOR_SPECIFIC ist, und dann den zurückgegebenen Rohwert an radius_get_vendor_attr() weitergeben, um die Vendor-ID und das spezifische Attribut zu erhalten.

Parameter

Name Typ Default Beschreibung
$data Pflicht string Roher Datenpuffer (binärer String) eines herstellerspezifischen RADIUS-Attributs, wie er von radius_get_attr() zurückgegeben wird, wenn der Attributtyp RADIUS_VENDOR_SPECIFIC ist.

Rückgabewert

Typ
array|false
Beschreibung
Bei Erfolg ein assoziatives Array mit den Schlüsseln vendor (int, die Vendor-ID), type (int, der herstellerspezifische Attributtyp) und data (string, der rohe Attributwert). Im Fehlerfall wird false zurückgegeben.

Beispiele

Vendor-Specific Attributes aus einer RADIUS-Antwort auslesen

<?php
// Verbindung zu einem RADIUS-Server herstellen
$radius = radius_auth_open();
radius_add_server($radius, '192.168.1.10', 1812, 'geheimespasswort', 3, 3);
radius_create_request($radius, RADIUS_ACCESS_REQUEST);
radius_put_string_attr($radius, RADIUS_USER_NAME, 'testuser');
radius_put_string_attr($radius, RADIUS_USER_PASSWORD, 'testpass');

$result = radius_send_request($radius);

if ($result === RADIUS_ACCESS_ACCEPT) {
    // Alle Attribute der Antwort durchlaufen
    while ($attr = radius_get_attr($radius)) {
        // Prüfen, ob es sich um ein Vendor-Specific Attribute handelt
        if ($attr['attr'] === RADIUS_VENDOR_SPECIFIC) {
            $vsa = radius_get_vendor_attr($attr['data']);
            if ($vsa !== false) {
                echo "Vendor-ID: " . $vsa['vendor'] . PHP_EOL;
                echo "Attribut-Typ: " . $vsa['type'] . PHP_EOL;
                echo "Attribut-Wert (hex): " . bin2hex($vsa['data']) . PHP_EOL;
            }
        }
    }
}

radius_close($radius);
Vendor-ID: 311 Attribut-Typ: 7 Attribut-Wert (hex): 4d6963726f736f6674

Microsoft-spezifisches Attribut MS-CHAP-Challenge identifizieren

<?php
// Bekannte Microsoft Vendor-ID (311) und Attribut-Typen
define('VENDOR_MICROSOFT', 311);
define('MS_CHAP_CHALLENGE', 11);
define('MS_CHAP2_RESPONSE', 25);

$radius = radius_auth_open();
// ... Server-Konfiguration und Request-Aufbau ...

while ($attr = radius_get_attr($radius)) {
    if ($attr['attr'] === RADIUS_VENDOR_SPECIFIC) {
        $vsa = radius_get_vendor_attr($attr['data']);
        if ($vsa !== false && $vsa['vendor'] === VENDOR_MICROSOFT) {
            switch ($vsa['type']) {
                case MS_CHAP_CHALLENGE:
                    echo "MS-CHAP-Challenge empfangen." . PHP_EOL;
                    break;
                case MS_CHAP2_RESPONSE:
                    echo "MS-CHAPv2-Response empfangen." . PHP_EOL;
                    break;
                default:
                    echo "Unbekanntes Microsoft-Attribut Typ " . $vsa['type'] . PHP_EOL;
            }
        }
    }
}
MS-CHAP-Challenge empfangen.

// Wichtig · Fallstricke

PECL-Erweiterung: Diese Funktion gehört zur PECL-Erweiterung radius, die separat installiert werden muss (pecl install radius). Sie ist nicht in der PHP-Standardinstallation enthalten.

Reihenfolge der Verarbeitung: radius_get_vendor_attr() muss immer nach radius_get_attr() aufgerufen werden und nur dann, wenn der zurückgegebene Typ RADIUS_VENDOR_SPECIFIC (26) ist. Ein Aufruf mit beliebigen Strings führt zu undefinierten Ergebnissen oder false.

Binäre Daten: Das Feld data im Rückgabe-Array enthält Rohdaten im Binärformat. Je nach Attributtyp muss es mittels radius_cvt_string(), radius_cvt_int() oder radius_cvt_addr() weiterverarbeitet werden.