Isolution666
@Isolution666
Full-Stack Developer

Как предотвратить xss уязвимость на yii2?

К примеру, создали вы в контроллере экшен:
public function actionPage($target = '') {
            $get = News::find()->where(['link' => $target])->one();
            return $this->render('page', ['target' => $target, 'get' => $get,]); 
	}

Затем создали страницу, файл page.php
<?php 
    use yii\helpers\Html; 
    $this->title = $get->title;
?> 
<h1>Hello <?= Html::encode($target) ?></h1> 
<p>Welcome to your <?=$get->world;?></p>
<h1><?=$get->header;?></h1>

И вроде всё замечательно, get параметры превосходно передаются, смотришь и радуешься. Но настаёт момент, когда кто-то вручную ввёл другую ссылку, и там где get параметры подставлялись, стало пусто, страница поломалась!!! Раньше, когда я писал самописные сайты, в этих случаях делал редирект для всех введёных внешних ссылок, так что даже если вдруг злоумышленник решит ввести какую-то вредоностную ссылку, его редиректит либо на страницу со списком, либо на ошибку 404 - нет такой страницы! И всё ))
ВОПРОС: как бы это глупо не звучало, подскажите как сделать редирект на yii2, чтобы введёные внешние ссылки приводили к ошибке неправильных или не существующих get-запросов, дабы избежать xss уязвимости и показа пустых страниц?

В случае с цыфрами, я узнавал число записей из БД, и ставил условие, что если цифра get запроса больше числа записей, редирект на список статей. Отрицательные и строковые get-запросы приводили к 404 странице, и я был спокоен. Можно было бы подобное провернуть и со строковыми данными, создав массив из существующих get-запросов, но тогда xss уязвимость остаётся открытой. Вводи что хочешь.
  • Вопрос задан
  • 539 просмотров
Решения вопроса 1
@AlikDex
причем тут xss?
Вашем случае будет достаточно:
public function actionPage($target = '') {
    $get = News::find()->where(['link' => $target])->one();

    if (null === $get) // В случае неудачного поиска  метод one() возвращает null всегда
        throw new NotFoundHttpException('Page not found');

    return $this->render('page', ['target' => $target, 'get' => $get,]); 
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@eskrano
Простите, но можете объяснить, зачем вы пишите это?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы