我有page.php
接收POST数据,它位于已知位置。 如何获取通过POST向page.php
发送数据的每个网页的网址,或如何阻止/允许来自某些网站的POST数据?
答案 0 :(得分:4)
您可以(虽然不可靠)通过$_SERVER['HTTP_REFERER']
获取推荐网页的网址。但是,在许多情况下,这将是空白的(最常见的是来自HTTPS站点)。
限制哪些网站可以使浏览器向您的脚本提交可接受的数据的唯一可靠方法是实施针对CSRF的保护并停止所有非您网站的网站。
生成随机令牌。将该令牌存储在cookie或会话中。将其存储在表单中的隐藏输入中。提交表单时,检查表单中的令牌是否与cookie /会话中的令牌匹配。如果没有,则提交数据的表单不在您的网站上。
我使用PayPal IPN,因此我需要检查POST是否来自PayPal
你试图以错误的方式解决这个问题。
阅读Paypal's IPN documentation。它们提供了一种确定事件是否来自它们的方法。
- PayPal HTTP向您的侦听器发送一条IPN消息,通知您事件。
- 您的侦听器向PayPal返回一个空的HTTP 200响应。
- 您的侦听器HTTP将完整的,未经更改的消息发送回PayPal;消息必须包含相同的字段(以相同的顺序) 作为原始消息并以与原始消息相同的方式进行编码 消息。
- PayPal发回一个单词 - VERIFIED(如果邮件与原始邮件匹配)或INVALID(如果邮件不匹配) 原)。
醇>
答案 1 :(得分: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
}
<强>更新强>
我认为以下问题是相关的:Verifying a Paypal transaction via POST information