私page.php
は POST データを受け取るものを持っています。それは既知の位置にあります。POST 経由でデータを送信する各ページの URL を取得するにはどうすればよいですか、または特定のサイトからの POST データをブロック/許可するにはどうすればよいですか?page.php
2 に答える
(確実ではありませんが) 経由で参照ページの URL を取得できます$_SERVER['HTTP_REFERER']
。ただし、これが空白になる状況がいくつかあります (最も一般的なのは、HTTPS サイトからの場合です)。
どのサイトが受け入れられるスクリプトにデータを送信する可能性があるかを制限する唯一の信頼できる方法は、CSRF に対する保護を実装し、自分のサイト以外のすべてのサイトを停止することです。
ランダムなトークンを生成します。そのトークンを Cookie またはセッションに保存します。フォームの非表示の入力に保存します。フォームが送信されたら、フォームのトークンが Cookie/セッションのトークンと一致するかどうかを確認します。そうでない場合は、データを送信したフォームがサイトにありませんでした。
PayPal IPN を使用しているため、POST が PayPal から送信されているかどうかを確認する必要があります
あなたはこの問題を間違った方法で解決しようとしています。
Paypal の IPN ドキュメントをお読みください。それらは、イベントがそれらから発生したかどうかを判断する手段を提供します。
- PayPal HTTP POST は、イベントを通知する IPN メッセージをリスナーに送信します。
- リスナーは空の HTTP 200 応答を PayPal に返します。
- リスナーの HTTP POST は、変更されていない完全なメッセージを PayPal に返します。メッセージには、元のメッセージと同じフィールドが (同じ順序で) 含まれ、元のメッセージと同じ方法でエンコードされている必要があります。
- PayPal は、VERIFIED (メッセージが元のメッセージと一致する場合) または INVALID (メッセージが元のメッセージと一致しない場合) という 1 つの単語を返信します。
次のようにして、フォームが特定のページからのものであることを確認できます。
フォームにランダムな隠し値を追加し、その値をページとともにセッションに保存します。
<?php
session_start();
$_SESSION['csfr_token'] = $randomValue; // Randomly generated string
$_SESSION['csfr_page_url'] = ; // URL of the current page
?>
<input type="hidden" name="csfr_token" value="<?php echo $randomValue; ?>" />
上記は明らかに、フォームを使用している場合にのみ適用されます。そうでない場合は、csfr_token
使用している方法を使用して投稿に追加します。
次に、投稿を管理するページで:
<?php
session_start();
if (isset($_SESSION['csfr_token']) && $_POST['csfr_token'] && $_SESSION['csfr_page_url'] && $_SESSION['csfr_token'] === $_POST['csfr_token'] && $_SESSION['csfr_page_url'] === 'the URL that you want to allow') {
// Do your stuff
} else {
// Post isnt valid
}
アップデート:
次の質問が関連していると思います: POST 情報による Paypal 取引の確認