PHP PHP  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

CSRF, CORS и безопасность HTTP

Тест связывает настройки браузера с серверной проверкой, поэтому простого перечня заголовков недостаточно. Сценарии требуют различать чтение и изменение данных, происхождение запроса, cookie-политику и допустимые источники.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. Проверяйте, кто инициирует запрос, какие полномочия отправляются автоматически и что разрешает браузер. Время — 85 минут.
Вопрос 1 из 30
Каким должен быть CSRF-токен?
PHP
session_start();
$_SESSION['csrf'] ??= bin2hex(random_bytes(32));
Вопрос 2 из 30
Почему токен только в cookie не защищает?
PHP
setcookie('csrf', $token, [
    'secure' => true,
    'samesite' => 'Lax',
]);
Вопрос 3 из 30
Как сравнивать токены?
PHP
$sent = $_POST['csrf'] ?? null;
$stored = $_SESSION['csrf'] ?? null;
$valid = is_string($sent)
    && is_string($stored)
    && hash_equals($stored, $sent);
Вопрос 4 из 30
Какие методы прежде всего защищать?
Вопрос 5 из 30
Что делает код неправильно?
PHPPHP/HTTP
$token=$_REQUEST['csrf']??'';
if($token==($_COOKIE['csrf']??'')) save();
Вопрос 6 из 30
Что обычно даёт SameSite=Lax?
PHP
setcookie('session', $id, [
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);
Вопрос 7 из 30
Что требуется для SameSite=None в современных браузерах?
PHP
setcookie('oauth_state', $state, [
    'secure' => true,
    'httponly' => true,
    'samesite' => 'None',
]);
Вопрос 8 из 30
Когда Strict может мешать?
PHP
setcookie('session', $id, [
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Strict',
]);
Вопрос 9 из 30
Заменяет ли SameSite CSRF-токен полностью?
Вопрос 10 из 30
Как задать cookie для cross-site OAuth state?
Вопрос 11 из 30
Что контролирует CORS?
PHP
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
$allowed = ['https://app.example'];
if (in_array($origin, $allowed, true)) {
    header("Access-Control-Allow-Origin: $origin");
    header('Vary: Origin');
}
Вопрос 12 из 30
Почему нельзя отражать любой Origin и разрешать credentials?
PHP
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
header("Access-Control-Allow-Origin: $origin");
header('Access-Control-Allow-Credentials: true');
Вопрос 13 из 30
Что такое preflight?
PHP
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    header('Access-Control-Allow-Methods: GET, POST');
    header('Access-Control-Allow-Headers: Content-Type, X-CSRF-Token');
    http_response_code(204);
    exit;
}
Вопрос 14 из 30
Можно ли использовать Access-Control-Allow-Origin: * с credentials=true?
Вопрос 15 из 30
Почему CORS не защищает endpoint от CSRF?
Вопрос 16 из 30
Что делает X-Content-Type-Options: nosniff?
PHP
header('X-Content-Type-Options: nosniff');
Вопрос 17 из 30
Как запретить встраивание страницы в iframe?
PHP
header("Content-Security-Policy: frame-ancestors 'none'");
Вопрос 18 из 30
Что делает HSTS?
PHP
header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
Вопрос 19 из 30
Что ограничивает Referrer-Policy?
Вопрос 20 из 30
Почему CSP nonce должен быть случайным для каждого ответа?
Вопрос 21 из 30
Почему curl может показать 200, а браузер сообщает CORS error?
PHP
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
if ($origin === 'https://app.example') {
    header("Access-Control-Allow-Origin: $origin");
}
Вопрос 22 из 30
Как тестировать CSRF?
PHP
$response = $client->post('/profile/email', ['email' => 'new@example.test']);
assert($response->status() === 403);

$response = $client->withSession($session)
    ->post('/profile/email', ['email' => 'new@example.test', 'csrf' => $validToken]);
assert($response->status() === 204);
Вопрос 23 из 30
Что означает CSP report?
PHP
$report = json_decode(file_get_contents('php://input'), true, 512, JSON_THROW_ON_ERROR);
$logger->warning('CSP violation', [
    'directive' => $report['csp-report']['violated-directive'] ?? null,
    'blocked' => $report['csp-report']['blocked-uri'] ?? null,
]);
Вопрос 24 из 30
Какие origin считать разными?
Вопрос 25 из 30
Что проверять у OPTIONS?
Вопрос 26 из 30
Почему доверять X-Forwarded-Proto от любого клиента опасно?
PHP
$isHttps = ($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '') === 'https';
setcookie('session', $id, ['secure' => $isHttps]);
Вопрос 27 из 30
Как выпускать строгую CSP?
PHP
header("Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report");
Вопрос 28 из 30
Что мониторить?
Вопрос 29 из 30
Зачем проверять Host?
Вопрос 30 из 30
Какой принцип для защитных заголовков лучше?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу