PHP使用OpenSSL加密URL参数出现自动转码异常如何解决
问题原因
两个现象分别对应不同的触发逻辑:
- 参数内容被自动编码:普通
base64_encode生成的密文包含+、/、=三类URL特殊保留字符,浏览器发起请求时会自动对非URL合规字符做百分号编码:+会被转成%20(URL解码后对应空格),=会被转成%3D。其中+被转成空格会直接破坏base64密文结构,导致后续解密失败,这是URL传输的标准行为,不是OpenSSL加密逻辑出错。 - 访问路径被改写:你用的是WordPress站点,原路径带
/wp-admin/前缀,如果没有在WordPress后台正确注册对应管理页路由,WP的固定链接重定向规则会自动把不存在的管理路径跳转到匹配的前台路径,就会出现你看到的路径从/wp-admin/response变成/response/的情况。
修复方案
- 密文拼接URL前必须转成URL安全格式,不要直接用普通base64结果传参:
$encryptedText2 = openssl_encrypt($email_encrypt,"AES-128-CBC",$secretKey,OPENSSL_RAW_DATA,$iv); $base64Encrypt = base64_encode($encryptedText2); // 转换为URL安全的base64串:替换+/为-_,去掉末尾的=填充 $urlSafeParam = rtrim(strtr($base64Encrypt, '+/', '-_'), '='); // 再把$urlSafeParam拼到URL参数里即可 - 后端接收参数解密前,先把URL安全格式还原为标准base64再解密:
$recvParam = $_GET['useremail']; // 还原字符替换 $originBase64 = strtr($recvParam, '-_', '+/'); // 补回之前去掉的=填充符,把字符串长度补到4的倍数 $padLength = 4 - (strlen($originBase64) % 4); if ($padLength != 4) { $originBase64 .= str_repeat('=', $padLength); } $rawEncrypt = base64_decode($originBase64); // 后续正常调用openssl_decrypt解密即可 - 路径重写问题:如果接口是WordPress后台管理接口,需要按WP规范注册admin路由,避免被重定向;如果是前台接口,生成URL时直接使用正确的前台路径,不要带
/wp-admin/前缀即可。
注意:不要依赖浏览器自动URL编码传普通base64串,即使后端会自动做URL解码,
+被转成空格的问题依然会破坏密文结构,必须手动做URL安全的base64转换。
内容的提问来源于stack exchange,提问作者Amy
相关产品推荐
相关产品推荐

