Signatur
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
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);
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);
// 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.