这种 xss 暴露有多大风险以及如何使其更安全

How risky is this xss exposure and how to make it safer

在描述问题之前,我将向您说明我允许此 xss 暴露的原因。

上下文

我依赖外部API。 API 返回的字段之一是 html(已编码)。我可以解码它并在页面中显示它而不用担心,因为他们没有兴趣引入恶意代码。我发现的问题是他们的 html 并不总是有效的,如果按原样显示它会破坏页面。所以现在我在 iframe 上展示它,这样它就不会破坏任何东西。

代码

我在嵌入 iframe 的主页的隐藏文本区域中有 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. 如果有人在 ID 为 "my-data" 的字段中包含恶意代码的页面中嵌入 iframe 页面,我会面临什么样的风险?
  2. 我检查了防止该页面嵌入我自己网站以外的页面的现有方法。我发现有一些标签可以用来告诉浏览器不要这样做,还有一些 js 代码可以用来防止这种情况发生。这两种方法都不是很可靠。在后端,您可以配置一个 .htaccess 以防止页面嵌入到外部页面中。但它似乎对所有页面而不是特定页面都这样做。还有可能使它安全吗?

为了确保安全,请不要在父级中做任何操作,删除文本框并将所有内容移动到 iframe 页面:

<div id="my-data">

  <?php echo $myData; ?>

</div>

...无论你从哪里得到 $myData,也需要放在这里。

What kind of risk I am incurring if somebody embeds the iframe page in an page that contains malicious code in a field with id "my-data"?

正在输出

X-Frame-Options: SAMEORIGIN

响应 header 将防止您的框架页面被其他人框架 (source)。

即使他们确实构建了您的回复,由于 Same Origin Policy.

,恶意网站也无法读取内容。

但是,由于像点击劫持这样的攻击,最好还是输出这个 header。

另请注意,X-Frame-Options 目前正被 CSP's frame-ancestors 取代,因此目前为新旧浏览器同时输出 header 会很有用支持。