PHP ksort()函数在远程服务器上根本没有排序.也没有抛出错误



我正在编写一个PHP函数,该函数接受一个$_GET参数数组,并输出这些参数的SHA签名(用秘密腌制)来验证真实性。

目前看起来是这样的:

private function generateShasign($fields) {
unset($fields['SHASIGN']);
ksort($fields, SORT_NATURAL | SORT_FLAG_CASE);
$phrase = "";
foreach($fields as $key => $field){
// if(!empty($field) && $field != '0'){
$phrase .= strtoupper($key) . '=' . $field . 'SECRETSALT';
// }
}
return strtoupper(sha1($phrase));
}

它从请求中取消设置SHA-SIGNATURE参数,将它们放在"KEY=value.CSECRETSALT"格式中,并对它们进行排序(使用ksort())

现在,这在我当地的环境中非常有效。返回的SHA等于get请求中的SHA-var,一切正常。

然而,在远程测试服务器上,它不起作用。Ksort似乎根本没有排序。并且它不会抛出错误。

快速print_r($phrase)返回(在有故障的远程服务器上):

SHA SIGN: ORDERID=ge9xBpZjXSECRETSALTCURRENCY=EURSECRETSALTAMOUNT=50SECRETSALTPM=CreditCardSECRETSALTACCEPTANCE=test123SECRETSALTSTATUS=5SECRETSALTCARDNO=XXXXXXXXXXXX1111SECRETSALTED=0214SECRETSALTCN=MATTHIASSECRETSALTTRXDATE=02/22/14SECRETSALTPAYID=28345877SECRETSALTNCERROR=0SECRETSALTBRAND=VISASECRETSALTIP=84.198.21.23SECRETSALT7F0B539A1DECC55E57860DEB9F7B3A301E1960AD

以及适当的工作环境:

ACCEPTANCE=test123SECRETSALTAMOUNT=50SECRETSALTBRAND=VISASECRETSALTCARDNO=XXXXXXXXXXXX1111SECRETSALTCN=MATTHIASSECRETSALTCURRENCY=EURSECRETSALTED=0214SECRETSALTIP=84.198.21.23SECRETSALTNCERROR=0SECRETSALTORDERID=iXAVBM1SBSECRETSALTPAYID=28345882SECRETSALTPM=CreditCardSECRETSALTSTATUS=5SECRETSALTTRXDATE=02/22/14SECRETSALT

显然,ksort()并没有对远程环境中的任何内容进行排序。因此,为什么要sha编码的短语中的参数顺序与GET请求中的顺序完全相同。

为什么ksort()不起作用并且没有抛出错误一直困扰着我。

在本地,我运行的是PHP/5.4.22(Apache)。和远程i-相信-PHP 5.3(NGINX)

更新:

ksort返回false。但我不明白为什么会失败。

非常感谢您的帮助!

开始:

http://php.net/ChangeLog-5.php#5.4.0

Added support for SORT_NATURAL and SORT_FLAG_CASE in array sort functions (sort, rsort, ksort, krsort, asort, arsort and array_multisort).

SORT_NATURAL和SORT_FLAG_CASE在远程环境中不工作。出于其他原因,我不知道。然而,SORT_STRING正在运行。因此,我通过先将键转换为大写,然后使用SORT_STRING进行排序来解决我的问题。

虽然不能解决问题,但我想这是一个可行的解决办法。

相关内容

  • 没有找到相关文章

最新更新