5

如何允许我的 PHP 文件只加载到一个iframe?

例如:

  • 防止直接访问:example.com/Loader.php
  • 允许 iframe 访问:<iframe name="TEST" src="Example.com/Loader.php"></iframe>
4

3 回答 3

15

你不会为此使用 PHP。试试 javascript。

if(window==window.top) {
    // not in an iframe
}
于 2013-03-29T22:37:46.527 回答
6

假设您有一个文件file1.php,该文件有一个iframeinside 并且iframe指向file2.php

文件file1.php的代码:

<iframe src="file2.php" width="500" height="100"></iframe>

文件file2.php的内容:

<?php
echo "This file exist in an iframe";
?>

因此,让我们将file1.php更新为以下代码:

<?php
session_start();
$_SESSION['iframe'] = md5(time()."random sentence");
?>
<iframe src="file2.php?internal=<?php echo $_SESSION['iframe'];?>" width="500" height="100"></iframe>

并更新file2.php如下:

<?php
session_start();
if(!isset($_SESSION['iframe']) || !isset($_GET['internal']) || $_SESSION['iframe'] != $_GET['internal'])
    {
        die("This page can be accessed just from within an iframe");
    }
unset($_SESSION['iframe']);
//Continue processing using your own script
?>

试试这个,告诉我这是否有效:)

于 2013-03-30T18:59:02.360 回答
3

我知道这个话题很老,但我正在寻找一种方法来自己做这件事。

因此,也许将来其他人会发现这篇文章正在寻找一种强制页面仅在 iframe 内加载的纯 php 方法。

我的解决方案如下:

如果您控制两个页面(调用 iframe 的页面和加载在 iframe 内的页面),则可以完成。

首先验证引用页面。如果引用页面不正确,请终止该页面。

$referal_page = $_SERVER['HTTP_REFERER'];
if ($referal_page != $_SERVER['REQUEST_SCHEME']."://".$_SERVER['HTTP_HOST'].'/main/page/loading/iframe.php') {
    die;
}

因为任何人都可以欺骗 HTTP_REFERER,所以这不是最终的解决方案。因此,我为我网站的每个用户使用存储在数据库中的加载密钥。在 iframe 的页面上:

if (isset($_GET['key1'])) {
    $key1 = strip_tags($_GET['key1']);
    $stmt = $db->prepare('SELECT user_key FROM page_keys WHERE username = :username');
    $stmt->bindParam(':username', $username);
    $stmt->execute();
    $userkey = $stmt->fetchColumn();
    if ($userkey == $key1) {
        $bytes = random_bytes(12); //random. Increase input for more bytes
        $key2 = bin2hex($bytes);
        $stmt = $db->prepare('UPDATE page_keys SET user_key=:key WHERE username = :username');
        $stmt->bindParam(':username', $username);
        $stmt->bindParam(':key', $key2);
        $stmt->execute();
    } else {
        die;
    }
} else {
    die;
}

在加载 iframe 的页面上:

$stmt = $db->prepare('SELECT count(id) AS key_check FROM page_keys WHERE username = :username');
$stmt->bindParam(':username', $username);
$stmt->execute();
$key_check = $stmt->fetchColumn();
if ($key_check == 0) {
    $bytes = random_bytes(12); //random. Increase input for more bytes
    $userkey = bin2hex($bytes);
    $stmt = $db->prepare('INSERT into page_keys (username, user_key) VALUES (:username, :user_key)');
    $stmt->bindParam(':username', $username);
    $stmt->bindParam(':user_key', $userkey);
    $stmt->execute();
} else {
    $stmt = $db->prepare('SELECT user_key FROM page_keys WHERE username = :username');
    $stmt->bindParam(':username', $username);
    $stmt->execute();
    $userkey = $stmt->fetchColumn();
}

最后在 iframe 本身上:

<iframe id="page" src="the_page.php?key1=<?php echo $userkey;?>">

也可以使用标题重定向到加载 iframe 的页面,而不是死掉;

不使用 javascript 执行此操作的原因是用户仍然可以禁用 javascript 并加载页面,从而导致页面上的任何 php 仍然运行。

于 2018-10-21T09:04:24.267 回答