Насколько рискованно это воздействие xss и как сделать его более безопасным

Прежде чем описывать проблему, я дам вам контекст, почему я разрешаю эту экспозицию xss.

контекст

Я полагаюсь на внешний API. Одним из полей, возвращаемых API, является html (уже закодировано). Я могу расшифровать его и показать на странице, не беспокоясь, потому что они не заинтересованы во введении вредоносного кода. Проблема, которую я обнаружил, состоит в том, что их html не всегда действителен, и он разрывает страницу, если отображается как есть. Так что теперь я показываю его на фрейме, чтобы он ничего не сломал.

Код

У меня есть HTML-кодированная строка в скрытой текстовой области на главной странице, которая встраивает фрейм-фрейм, как это:

<textarea id="my-data" class="hidden">
<?php echo $mydata;?>
</textarea>
<div> 
<iframe src="/iframepage" frameborder="0" style="padding:0;width:100%;height:400px;">
</iframe> 

И на моей странице iframe у меня есть этот HTML:

<div id="my-data">
</div>

И этот код JQuery:

$(document).ready(function() {
    if ($('#my-data', window.parent.document).length){
        $parentJobDescription = $('#my-data', window.parent.document);
        $('#my-data').html($parentJobDescription.val());
    }

});

Описание проблемы и вопросы

  1. Какому риску я подвергаюсь, если кто-то вставляет страницу iframe на страницу, содержащую вредоносный код, в поле с идентификатором "my-data"?
  2. Я проверил существующие способы предотвращения встраивания этой страницы в страницу, отличную от моего собственного сайта. Я обнаружил, что есть некоторые теги, которые вы можете использовать, чтобы сказать браузеру не делать этого, а также некоторый код js, который вы можете использовать для предотвращения этого. Оба метода не очень надежны. В бэк-энде вы можете настроить.htaccess, чтобы предотвратить встраивание страниц во внешние страницы. Но, похоже, он делает это для всех страниц, а не для конкретной страницы. Есть ли еще возможность сделать это безопасным?

2 ответа

Решение

Чтобы сделать это безопасным, ничего не делайте в родительском элементе, удалите текстовое поле и переместите все на страницу iframe:

<div id="my-data">

  <?php echo $myData; ?>

</div>

... где бы вы ни находились $myData от, должен быть помещен здесь также.

Какому риску я подвергаюсь, если кто-то вставляет страницу iframe на страницу, содержащую вредоносный код, в поле с идентификатором "my-data"?

Вывод

X-Frame-Options: SAMEORIGIN

Заголовок ответа предотвратит создание вашей рамочной страницы кем-либо еще ( источник).

Даже если они подставили ваш ответ, злонамеренный сайт не сможет прочитать содержимое из-за одной и той же политики происхождения.

Однако из-за таких атак, как Clickjacking, в любом случае лучше выводить этот заголовок.

Также обратите внимание, что X-Frame-Options в настоящее время сокращается в пользу фрейм-предков CSP, поэтому на данный момент было бы полезно вывести как заголовки для поддержки старого, так и нового браузера.

Другие вопросы по тегам