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 を追加できるため、これは安全なソリューションではありません。物事の組み合わせになる可能性があるため、ハッシュの方が適しています。ハッシュを使用することにした場合は、salt を使用していることを確認してください。そうしないと、コリジョン / レインボー テーブル攻撃のリスクが生じる可能性があります

于 2012-12-06T05:23:30.247 に答える