Насколько рискованно это воздействие 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());
}
});
Описание проблемы и вопросы
- Какому риску я подвергаюсь, если кто-то вставляет страницу iframe на страницу, содержащую вредоносный код, в поле с идентификатором "my-data"?
- Я проверил существующие способы предотвращения встраивания этой страницы в страницу, отличную от моего собственного сайта. Я обнаружил, что есть некоторые теги, которые вы можете использовать, чтобы сказать браузеру не делать этого, а также некоторый код 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, поэтому на данный момент было бы полезно вывести как заголовки для поддержки старого, так и нового браузера.