Php Bigcommerce-无法验证加载回调

Php Bigcommerce-无法验证加载回调,php,bigcommerce,Php,Bigcommerce,各位开发者好 我面临着加载回调(以及扩展的卸载回调)的问题。 我试图按照文档中描述的算法验证请求的真实性 我能够解码json字符串,数据是正确的,但签名永远不匹配。我确保使用正确的客户端密码,并尝试了不同的编码/解码方案,但没有成功 另一个关注点是它们在示例(以及它们的示例)中提供的代码片段(PHP)。当签名匹配时,它们似乎返回null,而当它们不匹配时,则返回解码数据…() 这意味着每次安全测试都会通过,因为在我所有的尝试中,签名都不匹配 我是不是遗漏了什么 编辑:以下是文档中的示例。我真的不

各位开发者好

我面临着加载回调(以及扩展的卸载回调)的问题。
我试图按照文档中描述的算法验证请求的真实性

我能够解码json字符串,数据是正确的,但签名永远不匹配。我确保使用正确的客户端密码,并尝试了不同的编码/解码方案,但没有成功

另一个关注点是它们在示例(以及它们的示例)中提供的代码片段(PHP)。当签名匹配时,它们似乎返回null,而当它们不匹配时,则返回解码数据…()
这意味着每次安全测试都会通过,因为在我所有的尝试中,签名都不匹配

我是不是遗漏了什么

编辑:以下是文档中的示例。我真的不能给你样本数据,因为客户的秘密是保持秘密

function verify($signedRequest, $clientSecret)
{
    list($payload, $encodedSignature) = explode('.', $signedRequest, 2); 

    // decode the data
    $signature = base64_decode($encodedSignature);
    $data = json_decode(base64_decode($payload), true);

    // confirm the signature
    $expectedSignature = hash_hmac('sha256', $payload, $clientSecret, $raw = true);

    if (secureCompare($signature, $expectedSignature)) {
        error_log('Bad Signed JSON signature!');
        return null;
    }

    return $data;
}

function secureCompare($str1, $str2)
{
    $res = $str1 ^ $str2;
    $ret = strlen($str1) ^ strlen($str2); //not the same length, then fail ($ret != 0)
    for($i = strlen($res) - 1; $i >= 0; $i--) {
        $ret += ord($res[$i]);
    }
    return !$ret;
}

您没有遗漏任何内容,也不是时钟同步问题-28行示例代码提供了这两个方面,并且有一些非常关键的缺陷:

  • 示例代码对原始base64-编码的JSON(而不是base64解码的JSON)执行一个
    hash_hmac
    。(BigCommerceAPI提供给您的散列实际上是base64-解码的JSON的散列)
  • 由于使用
    $raw=true
    调用
    hash_hmac
    ,这意味着这两个字符串将始终有很大的不同:一个是原始二进制,另一个是十六进制
  • secureCompare
    逻辑检查错误。
    verify
    函数的
    if(secureCompare…
    部分要求与
    secureCompare
    函数的行为相反。如果secureCompare函数在字符串匹配时返回true,我们为什么调用
    error\u log
  • 将这三个问题放在一起,最终得到的代码似乎可以工作,但实际上却在默默地失败。如果使用示例代码,则很可能允许应用程序处理任何和所有“已签名”的请求

    下面是我对
    verify
    功能的正确实现:

    <?php
    
    function verifySignedRequest($signedRequest, $clientSecret)
    {
        list($encodedData, $encodedSignature) = explode('.', $signedRequest, 2);
    
        // decode the data
        $signature = base64_decode($encodedSignature);
        $jsonStr = base64_decode($encodedData);
        $data = json_decode($jsonStr, true);
    
        // confirm the signature
        $expectedSignature = hash_hmac('sha256', $jsonStr, $clientSecret, $raw = false);
        if (!hash_equals($expectedSignature, $signature)) {
            error_log('Bad signed request from BigCommerce!');
            return null;
        }
        return $data;
    }
    

    请添加一些您迄今为止尝试过的代码,因为这是一个有问题的
    TOTP
    ,您和他们的服务器之间的时间同步似乎已关闭。您应该同步您的服务器。谢谢,我6个月前无法从他们那里得到答案…所以今天在我的邮箱中收到一个安全更新,链接到我自己的帖子,这有点讽刺意味@Ohmlaote:噢,哇,BigCommerce发送了一封安全更新电子邮件?我没有收到,但如果你愿意转发给我,我想看看它的副本。:d