【问题标题】:Block POST data for certain sites阻止某些网站的 POST 数据
【发布时间】:2013-10-13 11:42:34
【问题描述】:

我有page.php 接收 POST 数据,它位于已知位置。 如何获取通过 POST 向page.php 发送数据的每个页面的 url,或者如何阻止/允许来自某些站点的 POST 数据

【问题讨论】:

    标签: php post


    【解决方案1】:

    您可以(虽然不可靠)通过$_SERVER['HTTP_REFERER'] 获取引用页面的 URL。但是,在许多情况下,这将是空白的(最常见的是来自 HTTPS 站点时)。

    限制哪些网站可能导致浏览器向您的脚本提交数据并被接受的唯一可靠方法是实施针对 CSRF 的保护并停止所有不是您网站的网站。 p>

    生成一个随机令牌。将该令牌存储在 cookie 或会话中。将其存储在表单中的隐藏输入中。提交表单时,检查表单中的令牌是否与 cookie/会话中的令牌匹配。如果不是,那么提交数据的表单不在您的网站上。


    我使用的是 PayPal IPN,所以我需要检查 POST 是否来自 PayPal

    你试图以错误的方式解决这个问题。

    阅读Paypal's IPN documentation。它们提供了一种方法来确定事件是否来自它们。

    1. PayPal HTTP 向您的听众发送一条 IPN 消息,通知您发生了事件。
    2. 您的侦听器向 PayPal 返回一个空的 HTTP 200 响应。
    3. 您的侦听器 HTTP 将完整的、未更改的消息发送回 PayPal;消息必须包含相同的字段(以相同的顺序) 作为原始消息并以与原始消息相同的方式进行编码 消息。
    4. PayPal 发送回一个单词 - 已验证(如果消息与原始消息匹配)或无效(如果消息与原始消息不匹配) 原创)。

    【讨论】:

    • 但是如何阻止 POST 数据?
    • 您使用if 语句,生成错误消息和exit
    • 是的,但我需要一些每次都能工作的东西,HTTP_REFERER 不能工作
    • 昆汀已经解释了解决方案。没有像HTTP_REFERER 这样的东西在任何地方都可以使用!您应该以某种方式使用 CSRF 策略。
    • 嗯,我试过了,但它对我不起作用,我的提供商被“窃听”了,所以我需要另一种方法来做到这一点
    【解决方案2】:

    您可以通过执行以下操作来验证表单是否来自某个页面:

    在您的表单中添加一个随机隐藏值,并将该值与页面一起保存到会话中:

    <?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

    【讨论】:

    • 我无法从发件人页面编辑代码...不是我的,它来自外部站点
    • 您还应该检查两个数组键是否存在。
    • 感谢 ComFreek。 @ user2758571 那么您的操作方式非常有限。不过我不太明白,为什么外部网站会向您发送帖子?
    • @AdamRivers 我使用 PayPal IPN,所以我需要检查 POST 是否来自 PayPal
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    相关资源
    最近更新 更多