我有page.php
它接收 POST 数据,它位于已知位置。如何获取通过 POST向其发送数据的每个页面的 url page.php
,或者如何阻止/允许来自某些站点的 POST 数据?
问问题
158 次
2 回答
4
您可以(虽然不可靠)通过$_SERVER['HTTP_REFERER']
. 但是,在许多情况下它会是空白的(最常见的是来自 HTTPS 站点时)。
限制哪些站点可能导致浏览器向您的脚本提交数据并被接受的唯一可靠方法是实施针对 CSRF 的保护并停止所有不是您站点的站点。
生成随机令牌。将该令牌存储在 cookie 或会话中。将其存储在表单中的隐藏输入中。提交表单时,检查表单中的令牌是否与 cookie/会话中的令牌匹配。如果不是,那么提交数据的表单不在您的网站上。
我使用 PayPal IPN,所以我需要检查 POST 是否来自 PayPal
你试图以错误的方式解决这个问题。
阅读Paypal 的 IPN 文档。它们提供了一种方法来确定事件是否来自它们。
- PayPal HTTP 向您的听众发布一条 IPN 消息,通知您发生了事件。
- 您的侦听器向 PayPal 返回一个空的 HTTP 200 响应。
- 您的侦听器 HTTP 将完整的、未更改的消息发送回 PayPal;消息必须包含与原始消息相同的字段(以相同的顺序),并以与原始消息相同的方式进行编码。
- PayPal 会返回一个单词 - 已验证(如果消息与原始消息匹配)或无效(如果消息与原始消息不匹配)。
于 2013-10-13T11:46:09.260 回答
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 交易
于 2013-10-13T11:51:08.550 回答