只允许特定域名加载iFrame

8
我正在为慈善机构开发一些小部件。由于某些标志许可的混乱,我必须找到一种只允许白名单站点运行代码的方法,或者发送错误消息(或类似内容)而不是小部件。
我们必须使用iFrames,因为已经有相当多的站点嵌入了它们。最好使用PHP解决方案,但如果需要,JS也可以。
所以问题来了:我能够检查iFrame所在域并发送不同的内容吗?
我想知道这样做的可能性有多大...
1个回答

6
你可以使用HTTP_REFERER头。
<?php

$allowed_domains = array(
        'a-good-domain.com',
        'another-nice-one.org',
        );

$allowed = false;
foreach ($allowed_domains as $a) {
    if (preg_match("@https?://$a/.*@", $_SERVER['HTTP_REFERER'])) {
        $allowed = true;
    } 
}

if ($allowed) 
    echo "Nice domain";
else
    echo "Ugly domain";

1
你应该使用哈希表来解决这个问题。这样就不需要循环遍历 $allowed_domains 了。 - friedo
1
HTTP_REFERER头可以被伪造吗?如果是,那么依赖这个头可能不安全。 - ramkumar
这个解决方案只适用于一次页面加载。一旦你在 iframe 中执行某些操作(比如更改页面),referer 就会变成 app 本身,而不是托管 iframe 的那个 referer。 - Mike Garcia
1
@ramkumar,Referer头欺骗需要用户自己采取行动。 我可以使用伪造的Referer标头向服务器发出请求,但我无法让其他人的浏览器发送伪造的标头。 - Sampo
@MikeGarcia 你也可以将托管的域名加入白名单。这样,任何进一步的导航都是允许的。 - Sampo
@MikeGarcia 抱歉,我误读了问题。但是您可以设置一个cookie或使用查询参数来在导航期间保持状态并提供不同的内容。 - Sampo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接