在第三方调用WebHook中验证用户

时间:2012-08-26 08:09:45

标签: php security session authentication webhooks

我有一个设置

  1. 用户可能会也可能不会登录我的网站
  2. 用户将表​​单提交给第三方服务,
  3. 第三方服务执行其操作,然后在我的网站上调用“webhook”,转发所有$_POST数据。
  4. 所以,举例说明:

        +---------------------+         +---------------------------+
        | mysite.com/form.php |-------->| thirdparty.com/submit.php |
        +---------------------+         +---------------------------+
                                                      |
                                                      v
                                        +---------------------------+
                                        |   mysite.com/webhook.php  |
                                        +---------------------------+
    

    如果用户在提交表单时已登录,那么如何在webhook中告知并验证此事实?

    例如,我可以天真地设置一个隐藏的字段,

    <input type="hidden" name="loggedOn" value="true" />
    

    但是任何人都可以欺骗那个。我以为我可能会通过用户的密码哈希,

    <input type="hidden" name="passwordHash" value="$2a$08$Lg5XF1Tt.X5TGyfb43vBBeEFZm4GTXQhKQ6SY6emkcnhAGT8KfxFS" />
    

    有效地使webhook再次“登录”,但这可能不正确,因为它会将用户的密码哈希暴露给客户端。

    我认为必须有一种更好的方法来使用会话机制,但我是会话的新手。也许我错过了合适的词汇?有人会引导我朝着正确的方向前进吗?谢谢!


    修改

    经过进一步研究后,我认为正确的方法是将隐藏的表单字段sid设置为会话ID session_id(),以便将其传递给webhook,而webhook又将使用会话id继续会话session_id($_POST['sid']); session_start();。我现在的问题是这是否是规范(和安全)的解决方案。

3 个答案:

答案 0 :(得分:3)

无论如何,用户已知用户的SessionID,并且无论如何都可以通过中间人的方法来嗅探。因此,如果您担心安全性会被“黑客攻击”(并且您无法使用SSL),那么您将实施IP跟踪,代理跟踪等所有可能被欺骗或伪造的细节,甚至可能会改变错误的会话(虽然很少,除了移动设备上的IP),但它是一个额外的层来添加。

所以基本的解决方案是你创建一个session_id,作为表单的一部分传递,然后像你/ Steve建议的那样使用它。

您无法使用IP或代理标头,因为这些标头会丢失。所以你需要看一下你可以使用的东西。

按复杂程度递增,但安全性:

  1. thirdparty.com是否将任何数据传递给您,其他帖子是什么?检查标题;您可能会发现他们通过原始IP,始发推荐人或代理人。你可以使用它们作为最简单的防线 - 它们应该匹配原始数据(你可以存储在会话中)。

  2. 在您的网站上创建表单时,请在会话中创建另一个唯一ID并存储。将其传递到隐藏字段以及表单中,当您从“thirdparty.com”获取表单数据时,您可以检查与会话中的唯一ID匹配的唯一ID。然后从会话中删除uniqueID,这意味着它只能使用一次。 (这是NONCE pd40在他的回答中提到的。)

  3. 如果你可以使用javascript然后捕获on submit,也将详细信息发送到你的服务器。您的服务器已经拥有会话中的详细信息。当“thirdparty.com”回复给您时,请调出会话并检查详细信息匹配。 (如果你不想在会话中存储所有细节,你可以MD5它 - MD5应该在返回时匹配)。你也可以给它加时间戳 - 如果你没有;在60秒内回复,那么事情就会变得有点慢[根据你的需要调整时间戳,但要慷慨]。

  4. 但是,我首选(我们使用的是)让您自己的服务器接收表单数据,然后使用Curl生成对thirdparty.com的POST请求。没有实际需要webhook - 您只需在继续处理之前检查响应 - 用户永远不会意识到第三方已被调用,并且您和服务器之间的交互也是如此。

  5. 此外,如果您真的很担心,请记录您认为“无效”的任何电话。你会发现用户在他们做对之前试图破解几次 - 所以永远不要透露你已经将他们识别为黑客(除非有可能出现误报;所以要小心)并记录。如果您从一个IP获得5个无效请求(例如),那么您可以假设来自该IP的所有后续请求都是狡猾的,即使是好的。记录日志,以便您进行监控。

    最后注意事项:如果您可以实施SSL,则SSL始终是最佳的。

    希望这可以让您了解可以实施的选项。

答案 1 :(得分:2)

使用会话ID有助于跟踪谁发出请求并提供一些安全保护。

您还可以考虑向第三方提出每个请求:

  • nonce 以检测重播
  • 时间戳以检测旧请求
  • 每次请求都会发送。您可以签署/哈希可能被篡改的任何值,并在 webhook
  • 中验证这些值

答案 2 :(得分:0)

如果您将用户会话存储在数据库中,这将更容易。当然,任何人都可以通过该表格(欺骗它),但是,如果在触发您的“webhook”时,您在会话表中检查了有效的会话密钥,那么您将会很高兴。

相关问题