Auto-gegenereerd via Reflection — blijft altijd in sync met src/.
Csrf
Framework\Security\CsrfCSRF-token beheer bovenop {@see Session}.
$csrf = new Csrf($session);
$token = $csrf->token();
echo $csrf->field(); // <input type="hidden" name="_csrf" value="...">
if (!$csrf->validate($_POST['_csrf'] ?? '')) {
throw new \RuntimeException('Invalid CSRF token');
}
$csrf->rotate(); // post-login / post-form: nieuwe token
Token = 32 random bytes (hex) per session. Validatie via `hash_equals`
(constant-time vergelijking, voorkomt timing-attacks).
Legacy `Utils::validCSRFcookie()` (deterministische sha256 van SERVER_NAME +
REMOTE_ADDR — niet echt CSRF-veilig, maar gedeeld over migrating callers)
is bereikbaar via {@see Csrf::legacy()} / {@see Csrf::legacyValid()}.
__construct(\Session $session)7 public methods
clear(): voidVerwijder uitsluitend de CSRF-token uit de session (bv. bij logout
als je de rest van de session wilt behouden).
field(string $name = '_csrf'): stringGeeft een ready-to-use hidden form-field met de huidige token.
static legacy(): voidDeterministisch hash-cookie zoals legacy `Utils::setCSRFcookie()` /
`validCSRFcookie()`. **Niet** echt CSRF-veilig (gedeeld over sessies
met dezelfde server-name + IP) — alleen voor pages die nog niet zijn
gemigreerd.
Roept `setcookie()` aan met dezelfde flags als legacy:
path=/, secure=true, httpOnly=true, expire=session.
Validatie: `Csrf::legacyValid()` — vergelijkt `$_COOKIE['ehid']` met
dezelfde hash (`sha256(SERVER_NAME + REMOTE_ADDR)`).
static legacyValid(): boolrotate(): stringGenereer een nieuwe token (forceer rotation). Gebruik na login of na
form-submit om token-replay te voorkomen.
token(): stringGeeft de huidige token terug; genereert er één als 'ie nog niet bestaat.
validate(string $given): boolValideer een token via constant-time vergelijking.
Return false als de session geen token heeft of de waarden afwijken.
Encryption
Framework\Security\EncryptionEncryptie compatible met EasyHandling's bestaande encryptiestrings.
Algoritme exact gelijk aan legacy `\Encryption`** — anders kunnen we
bestaande ciphertexts in onze databases niet meer decrypten:
stage1 = AES-128-CTR( SALT || plaintext, key, randomIV )
stage2 = AES-128-CTR( IV || stage1, key, fixedIV )
stage3 = base62( random_digit_byte || hex(stage2) )
Defaults van constructor matchen de legacy constants — instances zonder
argumenten lezen/schrijven dus exact dezelfde format als `\Encryption`.
Voor nieuwe data met eigen sleutels: nieuwe instance met eigen $key/$salt.
Belangrijk:** legacy hardcoded de keys in source-code. Geef ze hier mee
via constructor (uit config/.env), niet hardcoderen in nieuwe code.
__construct(string $key = '8F9148711AFDA868CCF6C668E384D', string $salt = '8YB+3ZYB6%Z5CCxh^-XN88UQUBWKkrenUK39BcMkG958MvfgC9', string $fixedIv = 'F%?9y<xxEy;_N9hF', string $cipher = 'aes-128-ctr')2 public methods
decrypt(string $ciphertext): stringDecrypt; bij ongeldige input geeft het de input ongewijzigd terug
(legacy gedrag — sommige callers gooien ongecodeerde strings erin
en verwachten ze terug).
encrypt(?string $plaintext): ?stringReCaptchaMode
Framework\Security\ReCaptcha\ReCaptchaMode3 public methods
static cases(): arraystatic from(string|int $value): staticstatic tryFrom(string|int $value): ?staticV2_CHECKBOX, V2_INVISIBLE, V3ReCaptchaResult
Framework\Security\ReCaptcha\ReCaptchaResultResultaat van een Google reCAPTCHA-verificatie.
Voor v2 is `score`/`action` null. Voor v3 zit daar de risk-score
(0.0 = bot, 1.0 = mens) en de action-naam die bij `grecaptcha.execute`
is meegegeven.
__construct(bool $success, array $errorCodes = array (
), ?float $score = NULL, ?string $action = NULL, ?string $hostname = NULL, ?string $challengeTimestamp = NULL)2 public methods
errorCodesAsString(): stringpasses(float $minScore = 0.5): boolReCaptchaVerifier
Framework\Security\ReCaptcha\ReCaptchaVerifierServer-side verifier voor Google reCAPTCHA v2 (checkbox/invisible) en v3.
Pure data-flow: Form-input (token) → Google API → ReCaptchaResult.
Geen logging/sessions/redirects — caller bepaalt wat 'ie met `success`
en `score` doet.
$verifier = new ReCaptchaVerifier($secretKey);
$result = $verifier->verify($_POST['g-recaptcha-response'] ?? '', $_SERVER['REMOTE_ADDR'] ?? null);
if (!$result->passes(0.5)) { … }
Voor tests: injecteer een eigen {@see Transport} (bv. een spy of stub)
zodat de Google-call gemockt is.
__construct(string $secretKey, \TransportInterface $transport = \Framework\Http\CurlTransport::__set_state(array(
'caInfo' => NULL,
)))1 public method
verify(string $token, ?string $ip = NULL): \ReCaptchaResult