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

Защита от XSS и инъекций

Тест проверяет не знание одной функции экранирования, а способность выбрать защиту для HTML, атрибута, JavaScript, URL и SQL. Вопросы включают шаблонизаторы, подготовленные запросы и случаи, где фильтрация на входе не заменяет безопасный вывод.

Отвечено: 0 из 30
--:--
0%
💡 Инструкция: Выберите один ответ из пяти. Сначала определите контекст использования данных, затем выбирайте защитный механизм. На тест отведено 85 минут.
Вопрос 1 из 30
Как вывести имя пользователя в HTML-тексте?
PHP
$name = (string) ($_POST['name'] ?? '');
echo '<p>' . htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '</p>';
Вопрос 2 из 30
Почему экранировать данные при записи в базу обычно неверно?
PHP
$userInput = $_POST['comment'] ?? '';
$comments->save($userInput);
Вопрос 3 из 30
Что предотвратит выполнение тега?
PHPPHP/HTML
$bio='<script>alert(1)</script>';
echo htmlspecialchars($bio,ENT_QUOTES|ENT_SUBSTITUTE,'UTF-8');
Вопрос 4 из 30
Зачем ENT_QUOTES в атрибуте, заключённом в кавычки?
PHP
$value = (string) ($_GET['value'] ?? '');
echo '<input value="' . htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '">';
Вопрос 5 из 30
Что даёт ENT_SUBSTITUTE?
Вопрос 6 из 30
Почему addslashes не является защитой SQL?
PHP
$email = addslashes((string) ($_GET['email'] ?? ''));
$sql = "SELECT id FROM users WHERE email = '$email'";
Вопрос 7 из 30
Что уязвимо?
PHPPHP/HTML
$sql="SELECT * FROM users WHERE email='".$_GET['email']."'";
$row=$pdo->query($sql)->fetch();
Вопрос 8 из 30
Как безопасно построить IN для массива id?
PHP
$ids = [10, 20, 30];
$placeholders = implode(',', array_fill(0, count($ids), '?'));
$stmt = $pdo->prepare("SELECT * FROM orders WHERE id IN ($placeholders)");
$stmt->execute($ids);
Вопрос 9 из 30
Как разрешить sort=name или sort=date?
PHP
$columns = ['name' => 'name', 'date' => 'created_at'];
$column = $columns[$_GET['sort'] ?? 'date'] ?? $columns['date'];
$stmt = $pdo->query("SELECT id, name FROM users ORDER BY $column");
Вопрос 10 из 30
Защищает ли prepared statement от логической ошибки доступа?
Вопрос 11 из 30
Можно ли вставить HTML-экранированную строку прямо внутрь JavaScript-литерала?
PHP
$value = (string) ($_GET['value'] ?? '');
echo '<script>const value = "' . htmlspecialchars($value, ENT_QUOTES, 'UTF-8') . '";</script>';
Вопрос 12 из 30
Как передать PHP-данные в script?
PHP
$data = ['name' => $name, 'role' => $role];
echo '<script type="application/json" id="page-data">';
echo json_encode($data, JSON_THROW_ON_ERROR | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
echo '</script>';
Вопрос 13 из 30
Почему href требует проверки схемы, а не только htmlspecialchars?
PHP
$url = (string) ($_GET['next'] ?? '');
echo '<a href="' . htmlspecialchars($url, ENT_QUOTES, 'UTF-8') . '">Продолжить</a>';
Вопрос 14 из 30
Какой вывод опасен?
Вопрос 15 из 30
Почему innerHTML на клиенте может вернуть XSS, хотя сервер отдал JSON?
Вопрос 16 из 30
Что даёт автоэкранирование шаблонизатора?
PHP
function html(string $value): string
{
    return htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
echo '<p>' . html($user->bio) . '</p>';
Вопрос 17 из 30
Когда допустим фильтр raw?
PHP
$trustedHtml = $sanitizer->sanitize($editorHtml);
echo $trustedHtml->value();
Вопрос 18 из 30
Почему «безопасный HTML»-объект полезнее обычной строки?
PHP
final readonly class SafeHtml
{
    private function __construct(public string $value) {}
    public static function fromSanitizer(string $html, HtmlSanitizer $sanitizer): self
    {
        return new self($sanitizer->sanitize($html));
    }
}
Вопрос 19 из 30
Как бороться с двойным экранированием?
Вопрос 20 из 30
Шаблон выбирается из $_GET["template"]. Главный риск?
Вопрос 21 из 30
Какой payload полезен для атрибутного контекста?
PHP
$payload = '" autofocus onfocus="alert(1)';
echo '<input value="' . $payload . '">';
Вопрос 22 из 30
Почему поиск подстроки &lt;script&gt; в HTML-тесте недостаточен?
PHP
$payloads = [
    '<script>alert(1)</script>',
    '<img src=x onerror=alert(1)>',
    '<svg onload=alert(1)>',
    'javascript:alert(1)',
];
Вопрос 23 из 30
Что показывает анализ потока taint?
Вопрос 24 из 30
Как воспроизвести сохранённую XSS?
Вопрос 25 из 30
Какие данные не стоит писать в журнал при атаке?
Вопрос 26 из 30
Что даёт CSP?
PHP
header("Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-$nonce'; object-src 'none'");
Вопрос 27 из 30
Зачем сначала режим Content-Security-Policy-Report-Only?
PHP
header("Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self'; report-uri /csp-report");
Вопрос 28 из 30
Что делать после обнаружения XSS в production?
Вопрос 29 из 30
Почему HttpOnly не делает XSS безвредной?
Вопрос 30 из 30
Какой CSP слаб?

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

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

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

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