1

我想要做的是一个秘密链接,例如 website.com/?secret=yes 当他们访问这个页面时,我想从 URL 中删除这个变量,所以我有以下内容:

<?php
if(isset($_GET['secret']) && $_GET['secret'] === 'yes') {
    header('Location: http://website.com');
    $secret="yes"; <--take note this is what I'm testing 
}
?>

上面的代码将立即重定向,因此 url 中没有变量,我尝试使用 $secret="yes"; 自己制作这个变量;能够将其与以下代码一起使用:

<?php if( 'yes' === $secret ) : ?>
secret content here
 <?php endif; ?>

这可能吗?我怎样才能使我的代码工作?我不想使用会话,因为我希望它只执行一次,或者每次他们通过秘密链接访问时,如果他们在没有它的情况下访问时不显示。

4

3 回答 3

5

不,那行不通。变量不会通过重新加载页面持续存在。但是,您可以使用会话或 cookie 来执行此操作:

<?php
session_start();
if(isset($_GET['secret']) && $_GET['secret'] === 'yes') {
    $_SESSION['secret']="yes";
    header('Location: http://website.com');
    exit();
}
?>

<?php if( $_SESSION['secret']=='yes'){ 
unset($_SESSION['secret']); //unset so when the page reloads the secret data will be gone
?>
secret content here
 <?php } ?>
于 2012-12-06T05:15:47.083 回答
1

您可以通过以下另一种方式实现。

创建一个文本文件,如 skey.txt

并编写如下代码:

 $filename = 'skey.txt';
if(isset($_GET['secret']) && $_GET['secret'] === 'yes') {
    $data = file_get_contents($filename);
    header('Location: http://localhost/'.$_SERVER['PHP_SELF']);
    file_put_contents($filename, $data."\n".$_SERVER['REMOTE_ADDR'].'secret=yes');
}

或者

$filename = 'skey.txt';
if(isset($_GET['secret']) && $_GET['secret'] === 'yes') {
    $data = file_get_contents($filename);
    file_put_contents($filename, $data."\n".$_SERVER['REMOTE_ADDR'].'secret=yes');
    header('Location: http://localhost/'.$_SERVER['PHP_SELF']);
}

当您将被重定向到页面时。你可以检查它如下:

$data = file($filename);
if(!empty($data) && in_array($_SERVER['REMOTE_ADDR'].'secret=yes', $data)) {
    echo 'hello';
    $getlines = array_keys($data, $_SERVER['REMOTE_ADDR'].'secret=yes');
    foreach($getlines as $lkey) {
        unset($data[$lkey]);
    }

    file_put_contents($filename, implode("\n", $data));
}

我想它会为你工作......

于 2012-12-06T05:39:00.317 回答
0

由于 HTTP 的无状态特性,您需要以一种或另一种方式传递秘密令牌。如果您想确保一旦您可以对某些唯一信息(IP、用户代理等)进行 MD 哈希并传递它,就可以访问内容。您应该能够将变量添加到标头调用中:

header('Location:http://website.com/?secret=yes');

请注意,您将使用

<?php if ($_GET['secret'] == "yes"): ?>


// secret content
<?php endif; ?>

这不是一个安全的解决方案,因为任何人都可以将 ?sectet=true 附加到链接,散列会更好,因为它可以是事物的组合。如果您决定使用散列,请确保您使用的是盐,否则您可能会面临碰撞/彩虹表攻击的风险

于 2012-12-06T05:23:30.247 回答