Start · Sprachen · PHP · Referenz · Random\BrokenRandomEngineError

Random\BrokenRandomEngineError

Klasse

Wird geworfen, wenn eine <code>Random\Engine</code>-Implementierung fehlerhaftes Verhalten zeigt, z. B. stark verzerrte oder ungültige Zufallswerte liefert.

seit PHP 8.2.0 Kategorie: error

Signatur

class Random\BrokenRandomEngineError extends Random\RandomError

Beschreibung

Random\BrokenRandomEngineError ist ein Error, der signalisiert, dass eine verwendete Random\Engine-Implementierung als kaputt oder unbrauchbar eingestuft wurde. Ein typisches Szenario ist eine Engine, die kontinuierlich Bytes mit zu geringer Entropie oder mit starker statistischer Verzerrung produziert.

Der häufigste Auslöser in der PHP-Standardbibliothek ist die Random\Engine\Mt19937-Engine oder eine benutzerdefinierte Engine, die eine unzulässige Anzahl von Verwerfungsversuchen (Rejection Sampling) überschreitet. Intern begrenzt PHP die Anzahl der Versuche, einen gültigen Zufallswert innerhalb eines gewünschten Bereichs zu erzeugen. Werden diese Versuche erschöpft, gilt die Engine als defekt und dieser Fehler wird ausgelöst.

Dieser Fehler erbt von Random\RandomError, welcher wiederum von Error erbt. Da es sich um einen Error handelt (und keine Exception), sollte er typischerweise nicht im regulären Anwendungsfluss gefangen werden, sondern weist auf einen fundamentalen Defekt hin, der behoben werden muss.

Beim Entwickeln eigener Random\Engine-Implementierungen sollte sichergestellt werden, dass die Engine gleichmäßig verteilte, hochwertige Zufallsdaten liefert, um diesen Fehler zu vermeiden.

Beispiele

BrokenRandomEngineError durch fehlerhafte benutzerdefinierte Engine

<?php

use Random\Engine;
use Random\BrokenRandomEngineError;
use Random\Randomizer;

// Eine absichtlich fehlerhafte Engine, die immer 0xFF zurückgibt
class BiasedEngine implements Engine
{
    public function generate(): string
    {
        // Liefert immer denselben Wert — stark verzerrt
        return "\xFF";
    }
}

$randomizer = new Randomizer(new BiasedEngine());

try {
    // getInt versucht Rejection Sampling; da die Engine immer
    // denselben Wert liefert, schlägt dies nach vielen Versuchen fehl
    $value = $randomizer->getInt(0, 10);
    echo $value;
} catch (BrokenRandomEngineError $e) {
    echo "Fehlerhafte Engine erkannt: " . $e->getMessage() . PHP_EOL;
}
Fehlerhafte Engine erkannt: Failed to generate an acceptable random number in 50 attempts

Defensive Behandlung beim Einsatz benutzerdefinierter Engines

<?php

use Random\BrokenRandomEngineError;
use Random\RandomError;
use Random\Randomizer;
use Random\Engine\Xoshiro256StarStar;

// Verwendung einer zuverlässigen Standard-Engine aus PHP
$randomizer = new Randomizer(new Xoshiro256StarStar());

try {
    $zahl = $randomizer->getInt(1, 100);
    echo "Zufallszahl: $zahl" . PHP_EOL;
} catch (BrokenRandomEngineError $e) {
    // Kritischer Fehler: Engine ist defekt
    error_log('Kritisch: Zufalls-Engine ist fehlerhaft — ' . $e->getMessage());
    throw $e; // Weitergeben, da nicht behebbar
} catch (RandomError $e) {
    // Sonstige Zufalls-Fehler
    error_log('Zufallsfehler: ' . $e->getMessage());
}
Zufallszahl: 42

// Wichtig · Fallstricke

Sicherheitshinweis: Eine Engine, die diesen Fehler auslöst, sollte niemals für sicherheitsrelevante Zwecke wie kryptografische Schlüsselerzeugung, Token oder Passwörter verwendet werden. Für sicherheitskritische Anwendungen empfiehlt sich die Verwendung von Random\Engine\Secure, die auf die CSPRNG des Betriebssystems zurückgreift.

Rejection Sampling: PHP begrenzt intern die Anzahl der Versuche, einen gleichmäßig verteilten Wert innerhalb eines Bereichs zu erzeugen (aktuell 50 Versuche). Überschreitet eine Engine dieses Limit, weil sie zu viele verwerfbare Werte produziert, wird BrokenRandomEngineError geworfen.

Da BrokenRandomEngineError von Error (und nicht Exception) erbt, wird er nicht durch catch (Exception $e) abgefangen.