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