1

投票スクリプトがあります。それはうまくいきます。

しかし、私には少し問題があります。投票送信ページ (投票がデータベースに送信されるページ) に直接アクセスしたくありません。特定のリンクからのみアクセスできるようにしたい。

私の投票リンク:

<form>
<INPUT id="voteup1" type="BUTTON" VALUE="Vote it up!" ONCLICK="window.location.href='rankup.php?rankid=<? echo $id1; ?>'"> 
<INPUT id="votedown1" type="BUTTON" VALUE="Vote it down!" ONCLICK="window.location.href='rank.php?rankid=<? echo $id1; ?>'"> 
</form>

$id1ユーザーが投票したページを定義するためのものです。(投票がデータベースに追加されるときに重要です)

私は、人々がrankup.phpとrank.phpに直接アクセスすることを望んでいません。どうすればこれを防ぐことができますか?

4

3 に答える 3

3

HTTP はステートレスです。ページに「直接的/間接的に」到達することはありません。各リクエストは前のリクエストから切り離されています。

PHP には、この制限を克服するためのメカニズムがあります。それは、Cookie を使用するセッションです。

そのため、セッション変数を設定して、フラグとして使用することができます:「can-vote-now」、投票ボタンがあるページで、これが設定されていない場合は投票を禁止します。

ボタン付きのページ上の疑似コード:

set_voting_variable_for($poll_identifier);

rankup.php の疑似コード:

if (!is_voting_variable_set($poll_identifier)) {
  // redirect away
} else {
  // register the vote
}

ああ、物事を実現するページ(いわゆる「非冪等」アクション - 投票数を増やすなど) はGET(GET は変更せずに物事を表示するために予約されているため、 「冪等」アクション)経由で到達できないことに注意してください。POST代わりにを使用するフォームを作成したい場合があります。

于 2011-09-07T16:16:08.893 に答える
2

最善の方法は、Cookie を使用することです。特定の期間内に生成した Cookie 値のみを投票に使用することを許可します。そうしないと、Cookie 値を簡単に生成できてしまいます。

これは、PHP セッションを使用して簡単に行うことができます。

また、リクエストに対してアクションを発生させる (投票数を変更する) ことGETは推奨されないことも知っておく必要があります。 GET変数は、特定のパラメーターでデータを取得する場合にのみ使用する必要があります。POST代わりに使用してください。そうしないと、検索ボットが投票スクリプトに出くわすたびに、投票が変わります。

于 2011-09-07T16:15:34.047 に答える
1

PHP の referrer 変数$_SERVER['HTTP_REFERER']を使用して、参照 URL が自分のものであることを確認できます。ただし、この情報は送信されない可能性があり、HTTP ヘッダーの一部であるため、ユーザーが必要に応じて変更できるため、これを 100% 信頼することはできません。

示唆されているように、セッションはこれを行うための良い方法かもしれません。ユーザーはあなたのサイトで自分の Cookie を無効にすることができ、Cookie はユーザーが編集できるため、私は Cookie よりもセッションを選択します。セッションは、サーバーにアクセスできる人のみが編集できます (通常は共有ホスティング)。

また、私はあなたがこれを行っている方法に同意しません。現在、ブラウザで JavaScript を有効にしているユーザーに依存しています。一部のユーザーはそれを有効にしておらず、一部のユーザーのブラウザーはそれをサポートしていません。一部のユーザーは、そのようなページ リダイレクトを無効にします。

個人的には、2 つのスクリプトを使用するのではなく、次のような 1 つのスクリプトを使用します。

<form action="rank.php" method="post">
<input type="submit" value="Vote up!" />
<input type="submit" value="Vote down!" />
</form>

rank.php では、2 つのボタンのどちらが押されたかを検出し、それに応じて関数を実行します。セッション変数を使用して、投票するアイテムの ID を保存し、セッションからその ID を読み取り (必ずエスケープしてください)、最後にユーザーが ID を変更できないようにすることができます。分。

うまくいけば、それはあなたにいくつかのアイデアを与えるはずです.

于 2011-09-07T16:34:18.477 に答える