3

我有一个设置

  1. 用户可能会也可能不会登录到我的网站,
  2. 用户向第三方服务提交表单,并且
  3. 第 3 方服务做它的事,然后在我的网站上调用一个“webhook”,转发所有$_POST数据。

所以,为了说明:

    +---------------------+         +---------------------------+
    | 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();。我现在的问题是这是否是规范(和安全)的解决方案。

4

3 回答 3

3

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

因此,基本解决方案是为您创建一个 session_id,作为表单的一部分传递,然后按照您/史蒂夫的建议使用它。

您不能使用 IP 或代理标头,因为它们会丢失。所以你需要看看你可以使用什么。

按照复杂性的递增顺序,但安全性:

  1. 除了帖子之外,thirdparty.com 是否会将任何数据传递给您?检查标题;您可能会发现他们通过了原始 IP、原始引荐来源网址或代理。您可以将它们用作最简单的防线 - 它们应该与原始数据(您可以存储在会话中)相匹配。

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

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

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

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

最后说明:如果您可以实施,SSL 总是最好的。

希望这能让您对可以实施的选项有所了解。

于 2012-09-06T01:36:55.073 回答
2

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

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

  • 检测重放的随机数
  • 检测旧请求的时间戳
  • 随每个请求发送的您将对任何可能被篡改的值进行签名/散列,并在webhook中验证这些值
于 2012-09-04T01:21:17.757 回答
0

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

于 2012-09-04T00:44:02.367 回答