iFrame 对安全性有什么可能的用途?

信息安全 Web应用程序 验证 javascript html
2021-08-12 05:21:10

我正在查看我正在重新设计的旧登录表单的代码。这是一个简单的表格,有两个用于用户名和密码的输入字段。

但就在结束</table>标记之前有一个空白的 iFrame 看起来像

<iframe style="height:0px;width:0px;visibility:hidden" src="about:blank">This is a security measure.</iframe>

这可以提供哪些可能的安全措施?我想不出任何东西,也不能问一开始就把它放在那里的人。

1个回答

正如代码中的描述所暗示的,这是一种安全措施。通过浏览器自身的措施作为iframe针对XSS攻击的保护机制通过阻止 JavaScript 访问未在同一域上发布的帧和 iframe 来对抗这些完全相同的攻击类型。没有必要直接在文档中编写这部分 HTML,因为它也可以由稍后处理其内容的同一 JavaScript 编写,但此解决方案的开发人员可能希望让未来的开发人员清楚一些外部脚本会在登录表单发布之前对其进行验证,并且浏览器 XSS 预防机制用于在登录时实现更好的最终用户安全性。iframe 缺少 ID 也强烈暗示了这一点,这将使引用它变得更加容易。

然后,开发人员将使用如下所示的代码将 JavaScriptscript元素附加到iframeDOM:

window.onload = function () {

    var iframe = document.createElement('iframe');
    iframe.width = "0px";
    iframe.height = "0px";
    iframe.style.visibility = "hidden";
    iframe.id = "noXSSframe";
    iframe.setAttribute("src", "about:blank");

    document.getElementById("formID").appendChild(iframe);

    iframe.addEventListener('load', function (e) {
        var myElement = document.createElement('script');
        myElement.setAttribute('src', '/content/test.js');
        myElement.setAttribute('type', 'text/javascript');

        iframe.contentDocument.body.appendChild(myElement);
    }, false);

}

这只是一个示例,不一定与您的开发人员选择的方法完全相同,但应该足以用于演示目的。

然后,这个刚刚附加到 iframe 的外部 JavaScript 文件将以这样的方式编写,以说明通过 iframe 运行,以仅允许位于同一域中的脚本的方式引用父文档对象,而任何 XSS使用托管在父文档域之外的脚本替换被调用脚本的注入显然会被浏览器本身拒绝访问。防止浏览器XMLHttpRequests强制执行同源策略的唯一方法是在服务器的 HTTP 响应中附加额外的标头并明确允许跨域资源共享 (CORS)然而,这并不是 XSS 注入单独可以篡改的东西。

简而言之,这是确保负责操作、验证和最终发布登录表单(准备和启动 HTTP 请求)的 JavaScript 确实是从托管在与登录表单相同的域上的文件加载的一种优雅方式开启,有效防止简单的 XSS 注入。同时,如果 iframe 脚本进行一些额外的验证,它还可以防止钓鱼网站重复使用此登录表单并将登录请求发送到另一个域,将可以在服务器端验证的唯一响应值附加到表单的POST请求。