Start · Sprachen · PHP · Referenz · radius_put_vendor_attr

radius_put_vendor_attr

Funktion

Fügt einem RADIUS-Request ein herstellerspezifisches (Vendor-Specific) Binärattribut hinzu.

seit PHP 4.0.0 Kategorie: misc

Signatur

radius_put_vendor_attr(resource $radius_handle, int $vendor, int $type, string $value): bool

Beschreibung

radius_put_vendor_attr ermöglicht das Hinzufügen von herstellerspezifischen Attributen (Vendor-Specific Attributes, VSA) zu einem laufenden RADIUS-Request. Solche Attribute werden verwendet, wenn Standard-RADIUS-Attribute (RFC 2865) nicht ausreichen und ein Hersteller eigene Erweiterungen definiert hat – etwa Cisco, Juniper oder Microsoft.

Die Funktion akzeptiert neben dem RADIUS-Handle die Vendor-ID (z. B. 529 für Ascend oder 311 für Microsoft), den herstellerspezifischen Attribut-Typ sowie den Wert als Binär-String. Der Wert wird ohne weitere Konvertierung übergeben, was maximale Flexibilität bietet, aber entsprechende Sorgfalt beim Kodieren erfordert.

Die Funktion muss nach radius_create_request und vor radius_send_request aufgerufen werden. Für häufig genutzte VSA existieren spezialisierte Helfer-Funktionen wie radius_put_vendor_int oder radius_put_vendor_string.

Im Fehlerfall gibt die Funktion false zurück; mit radius_strerror lässt sich die genaue Fehlermeldung abrufen.

Parameter

Name Typ Default Beschreibung
$radius_handle Pflicht resource Das RADIUS-Handle, das zuvor mit radius_auth_open oder radius_acct_open erstellt wurde.
$vendor Pflicht int Die numerische Vendor-ID des Herstellers gemäß IANA Enterprise Numbers (z. B. 311 für Microsoft, 9 für Cisco).
$type Pflicht int Der herstellerspezifische Attribut-Typ als Integer, wie vom jeweiligen Hersteller in seinen RADIUS-Erweiterungen definiert.
$value Pflicht string Der Wert des Attributs als roher Binär-String. Für Integer- oder String-Werte sind die spezialisierten Funktionen radius_put_vendor_int bzw. radius_put_vendor_string zu bevorzugen.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false im Fehlerfall. Die Fehlermeldung lässt sich mit radius_strerror($radius_handle) abrufen.

Beispiele

Herstellerspezifisches Binärattribut für Microsoft RADIUS hinzufügen

<?php
// Microsoft Vendor-ID: 311
// MS-CHAP-Challenge Attribut-Typ: 11
define('VENDOR_MICROSOFT', 311);
define('MS_CHAP_CHALLENGE', 11);

$radius = radius_auth_open();
if (!$radius) {
    die('RADIUS konnte nicht geöffnet werden.');
}

if (!radius_add_server($radius, '192.168.1.10', 1812, 'geheimes_secret', 3, 3)) {
    die('Server konnte nicht hinzugefügt werden: ' . radius_strerror($radius));
}

if (!radius_create_request($radius, RADIUS_ACCESS_REQUEST)) {
    die('Request konnte nicht erstellt werden: ' . radius_strerror($radius));
}

// Binärer Challenge-Wert (16 Bytes)
$challenge = random_bytes(16);

if (!radius_put_vendor_attr($radius, VENDOR_MICROSOFT, MS_CHAP_CHALLENGE, $challenge)) {
    die('Attribut konnte nicht gesetzt werden: ' . radius_strerror($radius));
}

$result = radius_send_request($radius);
if ($result === RADIUS_ACCESS_ACCEPT) {
    echo 'Zugriff gewährt.';
} else {
    echo 'Zugriff verweigert oder Fehler: ' . radius_strerror($radius);
}

radius_close($radius);
Zugriff gewährt.

Cisco herstellerspezifisches Attribut setzen

<?php
// Cisco Vendor-ID: 9
// Cisco-AVPair Attribut-Typ: 1
define('VENDOR_CISCO', 9);
define('CISCO_AVPAIR', 1);

$radius = radius_auth_open();
radius_add_server($radius, '10.0.0.1', 1812, 'secret123', 3, 3);
radius_create_request($radius, RADIUS_ACCESS_REQUEST);
radius_put_attr($radius, RADIUS_USER_NAME, 'testuser');

// AVPair als Binär-String (hier als ASCII-String kodiert)
$avpair = 'shell:priv-lvl=15';

if (radius_put_vendor_attr($radius, VENDOR_CISCO, CISCO_AVPAIR, $avpair)) {
    echo 'Cisco AVPair-Attribut erfolgreich hinzugefügt.';
} else {
    echo 'Fehler: ' . radius_strerror($radius);
}

radius_close($radius);
Cisco AVPair-Attribut erfolgreich hinzugefügt.

// Wichtig · Fallstricke

Binäres Format: Der value-Parameter wird als roher Binär-String übergeben. Beim Übergeben von Integer-Werten muss man pack() verwenden (z. B. pack('N', $int) für einen 32-Bit-Big-Endian-Integer). Für einfachere Typen sollte man radius_put_vendor_int oder radius_put_vendor_string bevorzugen.

Reihenfolge beachten: Attribute müssen nach radius_create_request und vor radius_send_request gesetzt werden, sonst werden sie ignoriert oder führen zu Fehlern.

PECL-Erweiterung: Diese Funktion gehört zur PECL-Erweiterung radius und ist nicht in der Standard-PHP-Distribution enthalten. Sie muss separat installiert werden.