一个狗屁问题之不可见的分隔符之Zero-with-space

仅仅记录一番

 

线上业务解密异常。

检查对比代码无异常。复制信息制作demo解密无异常。

打印密钥发现一模一样,但是一个程序可以解密一个程序解密不了,怀疑是编码问题,编码也调整测试了还是不行,然后有点怀疑人生了。

反复测试发现完全一样的密钥,长度不一样。

 

 

 

 

 检出数据库中存储密钥与本地打印密钥 转16进制进行对比发现数据库中密钥16进制比原密钥多了e2808b字符

 

 

 

 

 解决办法:

 

有关这种特殊字元存在以下三种形式:

 

Unicode code point

character

UTF-8 (in literal)

name

U+200B

 

\xe2\x80\x8b

ZERO WIDTH SPACE

U+200C

\xe2\x80\x8c

ZERO WIDTH NON-JOINER

U+200D

\xe2\x80\x8d

ZERO WIDTH JOINER

 

 

$key = preg_replace('/\p{C}+/u', "", $key);

// remove zero width space
$value = str_replace("\xe2\x80\x8b", '', $value);
$value = str_replace("\xe2\x80\x8c", '', $value);
$value = str_replace("\xe2\x80\x8d", '', $value);
posted @ 2021-04-21 16:24  year12  阅读(350)  评论(0编辑  收藏  举报