因 php 默认的 url encode 编码标准引发的一个问题
发布时间:2022-10-08 11:06:17 所属栏目:PHP教程 来源:
导读: 先看常用的校验请求合法性的一个方式
function createToken($params) {
$secretKey = 'secretKey';
ksort($params);
$query = http_build_query($params);
function createToken($params) {
$secretKey = 'secretKey';
ksort($params);
$query = http_build_query($params);
|
先看常用的校验请求合法性的一个方式 function createToken($params) { $secretKey = 'secretKey'; ksort($params); $query = http_build_query($params); $token = md5($query . $secretKey); return $token; } function createQuery($params) { $params['token'] = createToken($params); $query = http_build_query($params); return $query; } function checkQuery($params) { $token = $params['token']; unset($params['token']); return $token == createToken($params); } $params = [ 'k1' => 'v1', 'k2' => 'v2', 'time' => time() ]; $query = createQuery($params); echo $query, PHP_EOL; parse_str($query, $result); var_dump(checkQuery($result)); 输出 k1=v1&k2=v%202&time=1537806711&token=e088ac85569f9eb5266026bb8da989b2 bool(true) client 每个请求都携带一个 token ,token 是由请求参数和一个 secret key 一起md5之后计算出来的, 然后 server 端使用同样的算法计算token(一般还会校验time,给 token 一个有效期,我这里简化了),然后对比 tokenphp编码,保证请求的合法性。 乍一看,这个算法几乎天衣无缝,恩,我之前也是这么认为的,直到我用这个算法和一个 java 的服务交互时,才发现这个写法有些问题。 我在和 java 的同事连调时,有个请求总是报 token 校验错误,但是其他请求却没这个问题,我俩百思不得其解,互相 review 对方代码,也没有发现问题,然后和 java 的同事加了很多 log,终于发现了端倪。 我请求的参数里,有一个参数的值带有空格,然后我这边 url encode 之后 echo urlencode(" "); // + 但是他那边 url encode 之后是 // 假装这里有 java url encode 的代码 %20 这样,问题就很清晰了,不是算法问题,而是 url encode 的编码标准的问题。 (编辑:我爱制作网_池州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐


浙公网安备 33038102330577号