Html 页面上的用户定义iframe

Html 页面上的用户定义iframe,html,security,iframe,Html,Security,Iframe,允许用户定义iframe内容(将显示在页面上)安全吗 比如说。有一个表单可以提交一些html标记文本。此文本将显示在iframe中的某个页面上 UPD:另一种解释: 有一个包含下一个内容的页面: <html> <head>...</head> <body> ... <iframe> #document user-defined content here </iframe> ... <

允许用户定义iframe内容(将显示在页面上)安全吗

比如说。有一个表单可以提交一些html标记文本。此文本将显示在iframe中的某个页面上

UPD:另一种解释: 有一个包含下一个内容的页面:

<html>
<head>...</head>
<body>
  ...
  <iframe>
     #document
     user-defined content here
  </iframe>
  ...
</body>
</html>

...
...
#文件
此处为用户定义的内容
...
其中“用户定义的内容”是用户定义的内容。用户可以编写一些html标记,这些标记将显示在此页面上。 如果用户定义的内容如下所示:

<head>...</head>
<body>
  <p>I am awesome user!</p>
</body>
。。。
我是一个很棒的用户

接下来将显示页面内容:

<html>
<head>...</head>
<body>
  ...
  <iframe>
     #document
     <head>...</head>
     <body>
        <p>I am awesome user!</p>
     </body>
  </iframe>
  ...
</body>
</html>

...
...
#文件
...
我是一个很棒的用户

...
基本上有三个方面可能会出现问题:

  • A。对他们实施制裁
  • 提交损坏数据的用户。这通常不是一个问题
  • 用户被欺骗通过社会工程提交有害数据(自我XSS攻击)

隔离iframe,使其中的代码不能接触主站点。将生成iframe内容的代码放在另一个域上,与加载该框架的代码相同。

这基本上有三个方面可能会出错:

<iframe>
    user-defined content here
</iframe>
  • A。对他们实施制裁
  • 提交损坏数据的用户。这通常不是一个问题
  • 用户被欺骗通过社会工程提交有害数据(自我XSS攻击)
隔离iframe,使其中的代码不能接触主站点。将生成iframe内容的代码放在另一个域上,与加载该框架的代码相同。


<iframe>
    user-defined content here
</iframe>
此处为用户定义的内容
首先,这实际上不起作用。
标记的内容仅显示为不支持iFrame的古代浏览器的回退,您不能在其中包含正文内容。要从父页面将内容注入iframe,您必须:

  • 将其编码为
    数据:
    URL(在IE中不起作用)
  • 将其放在
    iframe srcdoc
    属性中(最新的HTML5版本,未得到很好的支持)
  • 在父页面中编写来自JavaScript的iframe文档内容
如果您执行其中一项操作,或者如果您的用户内容来自同一主机名下的另一个URL,则该内容与您的站点具有相同的JavaScript来源,iframe中的任何攻击者脚本都可以访问并控制您站点上用户会话中的所有内容。仅在iframe中包装相同来源的内容不会给您任何类型的安全边界

通常,这将构成跨站点脚本(XSS)攻击,不可接受。可以想象,您可能有一个不寻常的用户模型,XSS不会造成问题,但如果您有基于登录用户的访问授权或密码保护帐户,那么XSS将打破这些措施

如果希望在不破坏访问控制的情况下允许任意HTML内容,则必须:

  • 通过根据已知良好标记和属性的白名单清理输入来删除脚本功能(这并不简单,因此请寻找经过测试的库来为您执行此操作,例如使用PHP的htmlpurifier)

  • 在未来,
    iframe沙盒
    还可以从iframe内容中删除脚本,但这还不够可靠

  • 如果您必须允许脚本,那么,正如昆廷所建议的,从不同的域为用户提供内容

(在iframe中包含任意HTML内容时,仍有一些问题需要担心,如网络钓鱼和反向点击劫持攻击,但没有什么比XSS更糟糕的了。)


此处为用户定义的内容
首先,这实际上不起作用。
标记的内容仅显示为不支持iFrame的古代浏览器的回退,您不能在其中包含正文内容。要从父页面将内容注入iframe,您必须:

  • 将其编码为
    数据:
    URL(在IE中不起作用)
  • 将其放在
    iframe srcdoc
    属性中(最新的HTML5版本,未得到很好的支持)
  • 在父页面中编写来自JavaScript的iframe文档内容
如果您执行其中一项操作,或者如果您的用户内容来自同一主机名下的另一个URL,则该内容与您的站点具有相同的JavaScript来源,iframe中的任何攻击者脚本都可以访问并控制您站点上用户会话中的所有内容。仅在iframe中包装相同来源的内容不会给您任何类型的安全边界

通常,这将构成跨站点脚本(XSS)攻击,不可接受。可以想象,您可能有一个不寻常的用户模型,XSS不会造成问题,但如果您有基于登录用户的访问授权或密码保护帐户,那么XSS将打破这些措施

如果希望在不破坏访问控制的情况下允许任意HTML内容,则必须:

  • 通过根据已知良好标记和属性的白名单清理输入来删除脚本功能(这并不简单,因此请寻找经过测试的库来为您执行此操作,例如使用PHP的htmlpurifier)

  • 在未来,
    iframe沙盒
    还可以从iframe内容中删除脚本,但这还不够可靠

  • 如果您必须允许脚本,那么,正如昆廷所建议的,从不同的域为用户提供内容

(在iframe中包含任意HTML内容时,仍有一些问题需要担心,如网络钓鱼和反向点击劫持攻击,但没有什么比XSS更糟糕的了。)