2016-11-16 5 views
0

私は、訪問者が複数のランディングページ(異なる言語)のいずれかに上陸すると、いくつかのプロモーションコードをフォームに入力する機会が与えられます。正しいコード(SQLテーブルに格納されているコード)のいずれかを入力すると、無料の製品を受け取るためのメール情報を与えることができるフォームの別のページに移動します。入力したコードが表にない場合、入力したコードが無効でブロックされているというメッセージが表示されます。トラフィックがランディングページを迂回するのを防ぐ

これはPHPで動作します。ランディングページフォームが入力されて送信されると、website:/formentry.php?promo=codeのようなURLが生成されます。ここで、 'code'はユーザーがフォームに入力したものと一致します。 「コード」がデータベーステーブルのコード列の文字列と一致すると、エントリフォームに送信されますが、そうでない場合はブロックされます。この時点ですべてがうまく動作し、数か月間スムーズに実行されています。

最近問題が発見されました:ウェブサイトに/formentry.php?code=codeを直接ブラウザのURLフィールドに入力することで、リンク先ページを回避することができます。これはいくつかの理由で問題であり、防止する必要があります。可能であることから

誰もが解決のための任意のアイデアを持っています。おそらく、ランディングページに戻って、これらのURLリクエストを送信するために.htaccessファイルを使用して

答えて

0

彼らはランディングページに正しいコードを入力すると、セッションを使用して、ユーザのセッションを設定することができます。

session_start(); 
$_SESSION[valid_user] = true; 

その後は、他のすべてのページ(非ランディングページ)の上に、あなたは次のようにバリデータを置きます:

if (!$_SESSION[valid_user]) 
{ 
    echo "You do not have permission to view this page"; 
} 

または、代わりにエラーメッセージを表示するので、あなたは別のページにユーザーをリダイレクトすることができます

if (!$_SESSION[valid_user]) 
{ 
    $url = "http://example.com"; 
    header("Location: $url"); 
    exit(); 
} 

これをさらに進めたい場合は、authとしましょう。コードは420あなたが提出されたコードを取るようにランディングページを設定し、製品の#420、または何のために

$_SESSION[420] = true;

、ページ上に設定し、ユーザーのセッションが420 == trueが含まれていることを、上記のように、検証することができます。そうすれば、彼らがクーポンコード420を使用する場合、彼らはすべての製品ページではなく、製品#420のページを見ることしか許されない。

+0

詳細なご協力ありがとうございます。しかし、私はあなたの指示に従って自分の能力を最大限引き出し、何かが動かない。私は追加しました $ _SESSION [valid_user] = true; とランディングページ if(!$ _ SESSION [valid_user]){echo "このページを表示する権限がありません"; } を入力フォームページに追加すると、リンク先ページを正しく通過してエントリページに移動してもエコーメッセージが表示されます。コード内に$ _SESSIONの真の値を無効にする何かがありますか? –

+0

私が正しく理解していれば、ランディングページの現在のプログラムが、コードが有効かどうかを確認します。同じコードを使用してセッションを設定します。あなたのランディングページコードが現在何をしているのか分かりませんが、「コードが有効であれば、正しいページに移動してください」といったようなものかもしれません。あなたのコードを少し変更してください。「コードが有効な場合は、SESSION変数を設定してから、正しいページに移動してください。コードが有効でない場合は、セッション変数を設定しないでください。 – Jacey

+0

こんにちはJacey、私はsession_start()を含まなかったので、動作していないようです。セッションを宣言する前に。両方のページの一番上にそのコード行を追加すると、あなたのソリューションは機能します!ご協力いただきありがとうございます。 –

0

がないURLを経由してプロモーションコードを渡し、?しかし、sessionsを介して。

+0

ありがとう:要求を受けたページで

<?php // In the page you have the form: // Generate the string $csrf_value = str_replace(['/', '+', '='], '', base64_encode(random_bytes(20))); // Save it in the session $_SESSION['csrf'] = $csrf_value; ?> <form action"a_page.php" method="POST"> <input type="hidden" name="csrf" value="<?php echo $csrf_value ?>" /> <input type="textfield" name="code" /> </form> 

。私はPHPセッションを調べて、そのような方法でソリューションを実装する方法を見つけようとします。現在のところ、私のPHPスキルはそれを含むほど強くありません。 –

0

あなたはそれを解決すると同時に、クロスサイトリクエスト偽造(CSRF)から自己を保護することができます。 (使用random_bytesは良いオプションです)ハッシュ、GUIDまたはそのような何かを生成します

  • :ここ

    はどのようにあります。

  • このハッシュをセッションに保存します。
  • 次に、フォームの非表示フィールドにハッシュを追加します。
  • フォームにGETの代わりにPOSTメソッドを使用します。
  • リクエストを受け取るページで、セッション内のリクエストとハッシュを比較し、一致しないか存在しない場合はエラーをスローします。

これは多くの点で、より良い保護を提供します。

いくつかのサンプルコードを使用できます。先端のための

<?php 
if (isset($_POST['csrf']) 
     && strlen($_POST['csrf']) > 0 
     && strcmp($_SESSION['csrf'], $_POST['csrf']) === 0) { 
    // All good, do your thing 
} else { 
    // Show error, this guy is trying to trick you 
} 
+0

ありがとうございました!私はそれを試みます。私はrandom_bytesについて知らなかったので、知っておいてよかった! –

関連する問題