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