【问题标题】:SagePay Form - Success/Failure Url failing when encoded to RFC1738SagePay 表单 - 编码为 RFC1738 时成功/失败 URL 失败
【发布时间】:2015-05-14 22:31:53
【问题描述】:

我们只是升级到 v3.0,同时重构我们的代码。

在这样做的同时,我们注意到在使用 http_build_query 时,它采用关联数组并将其转换为 RFC1738 有效 URL,SagePay 失败并出现以下错误:

The SuccessURL format is invalid

提交到 SagePay 端点的表单的编码类型为 application/x-www-form-urlencoded

但是...如果我们手动构建要加密的字符串:

$tmp = '';
foreach ($crypt_store as $key => $value) {
    $tmp .= sprintf('&%s=%s', $key, $value);
}

它有效...

现在据我了解 RFC1738,如果 url 中存在 url,则应该对其进行编码,即

RFC1738:

&VendorTxCode=Test&SuccessUrl=http%3A%2F%2Fwww.stackoverflow.com%3Fa%3Da%26b%3Db&FailureUrl...

SagePay:

&VendorTxCode=Test&SuccessUrl=http://www.stackoverflow.com?a=a&b=b&FailureUrl...

当然,如果 SagePay 遵循 RFC1738,那么对 URL 进行编码应该可以工作吗?还是因为字符串是加密的,这意味着它并不重要?

有什么想法吗?

谢谢

加文

【问题讨论】:

    标签: php opayo rfc1738


    【解决方案1】:

    你是对的。由于成功/失败 URL 在 Crypt 字段中加密,因此无需对其进行编码。

    【讨论】:

    • 除非它们包含& 或其他特殊字符?当 URL 包含与 crypt 字段中使用的参数匹配的参数时,这尤其会爆炸。 (根据我的测试和您的回答,我假设您在已知参数名称上拆分字符串,而不是在 & 上进行更标准的拆分)。
    • 正确 - 所以如果您的 SuccessURL 字符串包含 &VendorTxCode= 它将被删除。
    • @RikBlacow 这有点荒谬......请求正文遵循“类似urlencoded”的格式,但我们实际上无法根据行业标准RFC 转义这些值。我只是在使用一些遗留代码,当对用户提供的数据应用适当的转义后请求被破坏(错误 5080)时,我真的很惊讶。如果我应该让它保持原样,这不是一个安全漏洞吗?
    猜你喜欢
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多