【问题标题】:Check whether content can be displayed in iFrame does not work检查内容是否可以在 iFrame 中显示不起作用
【发布时间】:2015-12-09 13:04:31
【问题描述】:

我有以下代码来检查网页是否可以框架:

var req = new XMLHttpRequest();
var test = req.open('GET', link, false);
console.log("test",test); //ALWAYS undefined
if(req.send(null)){ //ALWAYS throws error NS_ERROR_FAILURE
    var headers = req.getAllResponseHeaders().toLowerCase();
    console.log("headers");
}else{
    console.log("FAILED");
}

我用几个链接对其进行了测试,无论是否可框架,但总是失败。你知道具体原因吗?

链接:

【问题讨论】:

    标签: javascript iframe


    【解决方案1】:
    • test 未定义,因为 open() 被声明为 void,它不返回任何值。查看MDN on the open method.
    • 为什么要将null 传递给send (见编辑)任何你应该打电话给req.send()的论点;相反,如果你想调用另一个版本的方法,你应该传递一个 Blob、Document、DOMString 或 FormData,但 null 不起作用
      编辑: 通常该方法被调用为send(null);这似乎是因为在历史上的某个时刻(旧吗?)send 的论点是强制性的。 This question 揭开谜底。

    • 此外,send 不返回任何值,因此if 中的条件永远不会评估为真。 MDN documents also the send method

    • 最后,您正在执行跨域请求,即您正在请求位于另一个域中的内容。 XMLHttpRequest 没有处理这个问题,你很可能会遇到这个错误:

      XMLHttpRequest 无法加载链接。请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin origin 因此不允许访问。

      如果您需要更多相关信息,请查看 StackOverflow 上的 this questionthis

    您可能想再次查看 MDN 网络上的 Using XMLHttpRequest,它有许多可以帮助您熟悉这些请求的可靠示例。


    编辑:扩展主题iframe embeddability

    可靠地检测网站是否可以嵌入iframe 是很困难的,正如this question 所示。在 JavaScript 中检测(或防止)帧破坏就像狗在追自己的尾巴。

    尽管如此,一个不想被合并的网站,希望能在回复中发送X-Frame-Options: DENY header。这不是很有用,因为您无法执行跨域请求:您的请求将失败知道X-Frame-Options 标头是否已设置。为了完整起见,这是检查对XMLHttpRequest 的响应是否包含给定标头的方法(但请注意,这只能在同一域中工作,这可能在您的控制之下,并且您已经知道页面是否是“可框架的”):

    function checkXFrame() {
        var xframe = this.getResponseHeader("X-Frame-Options");
        if (!xframe) {
            alert("Frameable.");
            return;
        }
        xframe = xframe.toLowerCase();
        if (xframe == "deny") {
            alert("Not frameable.");
        } else if (xframe == "sameorigin") {
            alert("Frameable within the same domain.");
        } else if (xframe.startsWith("allow-from")) {
            alert("Frameable from certain domains.");
        } else {
            alert("Someone sent a weird header.");
        }
    }
    
    var oReq = new XMLHttpRequest();
    oReq.open("HEAD" /* use HEAD if you only need the headers! */, "yourpage.html");
    oReq.onload = checkXFrame;
    oReq.send();
    

    (此代码不检查 404 或任何其他错误!)

    【讨论】:

    • 关于“为什么要传递null来发送?”问题,请参阅stackoverflow.com/questions/15123839/… - 说null 不起作用是不正确的
    • @CupawnTae 哦!有趣,我不知道。我会更新答案。
    • 这只是一个小问题,你已经得到了我的支持 :-) 也可能值得想知道这与内容是否可以在 iframe 中显示有什么关系......
    • 我不明白...那么我应该如何准确地执行对网站的请求并检查它是否可以包含在 iframe 中?例如,我可以检查 www.facebook.com 是否可以进入 iframe 吗?
    • @Fane 任何网站都可以进入iframe,问题是很多网站都有框架破坏者。检查stackoverflow.com/questions/7422300/…——这是一个相当复杂的话题,因为在我看来检测帧破坏者等同于绕过它。
    猜你喜欢
    • 2011-03-06
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2021-08-08
    • 2012-09-26
    相关资源
    最近更新 更多