Start · Sprachen · PHP · Referenz · radius_send_request

radius_send_request

Funktion

Sendet eine zuvor aufgebaute RADIUS-Anfrage an den Server und wartet auf eine Antwort.

Kategorie: misc

Signatur

radius_send_request(resource $radius_handle): int

Beschreibung

radius_send_request() sendet die mit radius_create_request() erstellte und mit Attributen befüllte RADIUS-Anfrage an den konfigurierten Server und wartet synchron auf eine Antwort. Die Funktion gehört zur PECL-radius-Erweiterung und wird für die Implementierung von RADIUS-Authentifizierung (z. B. PAP, CHAP) oder RADIUS-Accounting in PHP-Anwendungen verwendet.

Nach dem Aufruf gibt die Funktion einen Integer-Code zurück, der den Typ der Server-Antwort repräsentiert. Typische Rückgabewerte sind RADIUS_ACCESS_ACCEPT, RADIUS_ACCESS_REJECT oder RADIUS_ACCESS_CHALLENGE. Im Fehlerfall wird 0 zurückgegeben; die genaue Fehlermeldung kann anschließend mit radius_strerror() abgerufen werden.

Der typische Ablauf sieht so aus: Zuerst wird mit radius_auth_open() ein Handle erzeugt, dann wird der Server mit radius_add_server() konfiguriert, eine Anfrage mit radius_create_request() angelegt, Attribute werden über radius_put_attr() hinzugefügt, und schließlich wird radius_send_request() aufgerufen.

Die Funktion blockiert, bis eine Antwort eingetroffen ist oder ein Timeout auftritt. Für produktive Umgebungen sollte ein sinnvoller Timeout und ggf. ein Fallback-Server konfiguriert werden, um Hänger in der Anwendung zu vermeiden.

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 und mit mindestens einem Server und einer Anfrage konfiguriert wurde.

Rückgabewert

Typ
int
Beschreibung
Gibt einen Integer zurück, der den RADIUS-Antworttyp repräsentiert: RADIUS_ACCESS_ACCEPT (2), RADIUS_ACCESS_REJECT (3), RADIUS_ACCESS_CHALLENGE (11) oder andere gültige RADIUS-Antwortcodes. Im Fehlerfall wird 0 zurückgegeben; mit radius_strerror() kann die genaue Fehlermeldung abgerufen werden.

Beispiele

Einfache RADIUS-Authentifizierung mit PAP

<?php
// RADIUS-Handle für Authentifizierung öffnen
$radius = radius_auth_open();
if (!$radius) {
    die('Fehler: RADIUS-Handle konnte nicht erstellt werden.');
}

// Server hinzufügen (Host, Shared Secret, Port, Timeout, max. Versuche)
if (!radius_add_server($radius, '192.168.1.10', 1812, 'geheimesSecret', 3, 3)) {
    die('Fehler beim Hinzufügen des Servers: ' . radius_strerror($radius));
}

// Anfrage vom Typ Access-Request erstellen
if (!radius_create_request($radius, RADIUS_ACCESS_REQUEST)) {
    die('Fehler beim Erstellen der Anfrage: ' . radius_strerror($radius));
}

// Attribute setzen: Benutzername und Passwort (PAP)
radius_put_attr($radius, RADIUS_USER_NAME, 'testuser');
radius_put_attr($radius, RADIUS_USER_PASSWORD, 'geheimesPasswort');

// Anfrage senden
$result = radius_send_request($radius);

switch ($result) {
    case RADIUS_ACCESS_ACCEPT:
        echo "Authentifizierung erfolgreich: Zugriff gewährt.\n";
        break;
    case RADIUS_ACCESS_REJECT:
        echo "Authentifizierung fehlgeschlagen: Zugriff verweigert.\n";
        break;
    case RADIUS_ACCESS_CHALLENGE:
        echo "Server fordert weitere Informationen (Challenge).\n";
        break;
    case 0:
        echo 'Fehler: ' . radius_strerror($radius) . "\n";
        break;
    default:
        echo "Unbekannte Antwort: $result\n";
}

radius_close($radius);
Authentifizierung erfolgreich: Zugriff gewährt.

RADIUS-Accounting mit radius_send_request

<?php
// Handle für Accounting öffnen
$radius = radius_acct_open();
if (!$radius) {
    die('Fehler: RADIUS-Accounting-Handle konnte nicht erstellt werden.');
}

// Server konfigurieren
radius_add_server($radius, '192.168.1.10', 1813, 'geheimesSecret', 3, 3);

// Accounting-Request erstellen
if (!radius_create_request($radius, RADIUS_ACCOUNTING_REQUEST)) {
    die('Fehler: ' . radius_strerror($radius));
}

// Pflichtattribute für Accounting setzen
radius_put_attr($radius, RADIUS_USER_NAME, 'testuser');
radius_put_attr($radius, RADIUS_ACCT_STATUS_TYPE, RADIUS_START);
radius_put_attr($radius, RADIUS_ACCT_SESSION_ID, 'sess-00042');

// Anfrage abschicken
$result = radius_send_request($radius);

if ($result === RADIUS_ACCOUNTING_RESPONSE) {
    echo "Accounting-Anfrage erfolgreich bestätigt.\n";
} else {
    echo 'Accounting-Fehler: ' . radius_strerror($radius) . "\n";
}

radius_close($radius);
Accounting-Anfrage erfolgreich bestätigt.

// Wichtig · Fallstricke

Voraussetzung: Die PECL-Erweiterung radius muss installiert und in der php.ini aktiviert sein (extension=radius). Sie ist nicht im PHP-Kern enthalten.

Blocking-Verhalten: radius_send_request() blockiert den aktuellen PHP-Prozess, bis eine Antwort eingeht oder alle Retries und Timeouts erschöpft sind. In lang laufenden Web-Anfragen kann dies zu spürbaren Wartezeiten führen – daher sollte der Timeout-Wert bei radius_add_server() sorgfältig gewählt werden.

Sicherheit: Das Shared Secret sollte ausreichend lang und komplex sein und niemals im Quellcode hardcodiert werden. Verwende stattdessen Umgebungsvariablen oder sichere Konfigurationsdateien außerhalb des Web-Roots.

Fehlerbehandlung: Ein Rückgabewert von 0 bedeutet einen internen Fehler (z. B. Timeout, Netzwerkproblem). Verwende immer radius_strerror(), um die genaue Ursache zu ermitteln.