Start · Sprachen · PHP · Referenz · radius_put_attr

radius_put_attr

Funktion

Fügt einem RADIUS-Request-Paket ein binäres Attribut mit dem angegebenen Typ und Wert hinzu.

Kategorie: misc

Signatur

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

Beschreibung

radius_put_attr fügt einem RADIUS-Request ein Attribut in binärer Form hinzu. Diese Funktion wird verwendet, wenn ein Attributwert als roher Binär-String übergeben werden soll – im Gegensatz zu spezialisierteren Funktionen wie radius_put_string oder radius_put_int, die bestimmte Datentypen direkt verarbeiten.

Typische Anwendungsfälle sind herstellerspezifische Attribute (Vendor-Specific Attributes) oder Attribute, deren Wert bereits als Binary-String vorliegt (z. B. verschlüsselte Passwörter, Zertifikate oder sonstige Rohdaten). Der Parameter type entspricht dem RADIUS-Attribut-Code gemäß dem RFC 2865 oder dem jeweiligen Hersteller-RFC.

Die Funktion muss aufgerufen werden, nachdem mit radius_create_request ein neuer Request erstellt wurde und bevor dieser mit radius_send_request abgesendet wird. Es können mehrere Attribute durch wiederholten Aufruf der Funktion hinzugefügt werden.

Im Fehlerfall gibt die Funktion false zurück; mit radius_strerror kann die genaue Fehlermeldung abgerufen werden.

Parameter

Name Typ Default Beschreibung
$radius_handle Pflicht resource Ein gültiges RADIUS-Handle, das zuvor mit radius_auth_open oder radius_acct_open erzeugt wurde.
$type Pflicht int Der numerische RADIUS-Attribut-Typ (z. B. RADIUS_USER_NAME = 1, RADIUS_USER_PASSWORD = 2). Die verfügbaren Typen sind als Konstanten im RADIUS-Modul definiert.
$value Pflicht string Der binäre Wert des Attributs als PHP-String. Dieser wird unverändert in das RADIUS-Paket eingefügt.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück. Im Fehlerfall wird false zurückgegeben; die genaue Fehlermeldung lässt sich mit radius_strerror($radius_handle) abrufen.

Beispiele

Binäres Attribut zu einem RADIUS-Authentication-Request hinzufügen

<?php
$rh = radius_auth_open();

if (!$rh) {
    die('Konnte RADIUS-Handle nicht öffnen.');
}

// RADIUS-Server konfigurieren
if (!radius_add_server($rh, '192.168.1.10', 1812, 'geheim', 5, 3)) {
    die('Fehler beim Hinzufügen des Servers: ' . radius_strerror($rh));
}

// Neuen Authentication-Request erstellen
if (!radius_create_request($rh, RADIUS_ACCESS_REQUEST)) {
    die('Fehler beim Erstellen des Requests: ' . radius_strerror($rh));
}

// Benutzername als Standard-String-Attribut setzen
radius_put_string($rh, RADIUS_USER_NAME, 'maxmustermann');

// Binäres Attribut hinzufügen (z. B. ein benutzerdefiniertes Binär-Feld)
$binaryData = pack('NCC', 12345, 1, 0); // Beispiel-Binärdaten
if (!radius_put_attr($rh, RADIUS_USER_PASSWORD, $binaryData)) {
    die('Fehler beim Setzen des Attributs: ' . radius_strerror($rh));
}

// Request absenden
$result = radius_send_request($rh);
if ($result === RADIUS_ACCESS_ACCEPT) {
    echo 'Authentifizierung erfolgreich!';
} else {
    echo 'Authentifizierung abgelehnt oder Fehler: ' . radius_strerror($rh);
}

radius_close($rh);
?>
Authentifizierung erfolgreich!

Vendor-Specific Attribute (VSA) als Binärwert hinzufügen

<?php
$rh = radius_acct_open();

if (!$rh) {
    die('Konnte RADIUS-Accounting-Handle nicht öffnen.');
}

radius_add_server($rh, '10.0.0.1', 1813, 'shared_secret', 5, 3);
radius_create_request($rh, RADIUS_ACCOUNTING_REQUEST);

// Vendor-ID und Vendor-Attribut-Code für ein herstellerspezifisches Attribut
$vendorId   = 9;    // Cisco Vendor-ID
$vendorType = 1;    // Cisco-AV-Pair
$vendorValue = 'service-type=framed';

// Binären VSA-Payload manuell zusammenbauen:
// Vendor-ID (4 Byte, Big-Endian) + Type (1 Byte) + Length (1 Byte) + Wert
$vsa = pack('NCC', $vendorId, $vendorType, strlen($vendorValue) + 2) . $vendorValue;

if (!radius_put_attr($rh, RADIUS_VENDOR_SPECIFIC, $vsa)) {
    die('VSA konnte nicht gesetzt werden: ' . radius_strerror($rh));
}

echo 'Vendor-Specific Attribute erfolgreich hinzugefügt.';

radius_close($rh);
?>
Vendor-Specific Attribute erfolgreich hinzugefügt.

// Wichtig · Fallstricke

Vorsicht bei Passwörtern: RADIUS-Passwörter werden im Protokoll verschlüsselt übertragen (MD5-basiert). Wer das Passwort-Attribut (RADIUS_USER_PASSWORD) manuell als Binärwert übergibt, muss die Verschlüsselung gemäß RFC 2865 selbst implementieren. In der Regel ist es sicherer und einfacher, dafür die passende Hilfsfunktion der RADIUS-Erweiterung zu verwenden.

Erweiterung erforderlich: Die Funktion radius_put_attr gehört zur PECL-Erweiterung radius. Diese muss explizit installiert und in der php.ini aktiviert sein (extension=radius). Die Erweiterung steht auf Plattformen wie Linux und macOS zur Verfügung; unter Windows ist die Unterstützung eingeschränkt.

Für einfache Attribut-Typen (Ganzzahlen, Zeichenketten, IP-Adressen) sollten die spezialisierten Funktionen radius_put_int, radius_put_string und radius_put_addr bevorzugt werden, da sie die korrekte Kodierung automatisch übernehmen.