第一部分 概念&原理
一、base64是什么
用64个可打印字符来表示二进制数据的方法。【编码后的字符长度不是32位或64位,而是4的倍数,今天还想当然的以为是32位】
Base64【维基百科中文】
二、原理
base64【廖雪峰的官方网站-有细节说明】
三、小工具
1、base64在线编码解码
https://base64.us/
2、在线正则表达式测试
https://tool.oschina.net/regex/
第二部分 实践
一、Web应用中使用base64编码参数值并进行正则校验
1、参数特点
API请求参数tabOrder表示多个tab排序,例如:0,3,2,6,1,5,4,7,8,9 既[tabOrder=0,3,2,6,1,5,4,7,8,9],显然直接这么传递不合适,需要对值进行编码
比如:http://x.x.x.x:8220/search/albumsdetail?tn=albumsdetail&word=%E7%BE%8E%E5%A5%B3&album_tab=%E4%BA%BA%E7%89%A9&album_id=45&rn=30&fr=searchresult&dyTabStr=MCwzLDIsNiwxLDUsNCw3LDgsOQ%3D%3D
2、使用base64编码
$dyTabStr = '0,3,2,6,1,5,4,7,8,9'; $val = base64_encode($dyTabStr); var_dump($val); // string(28) "MCwzLDIsNiwxLDUsNCw3LDgsOQ=="
3、对参数进行正则校验
校验base64正则: ^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$
参考:如何检查字符串是否为Base64编码
$res = preg_match('#^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$#', 'MCwzLDIsNiwxLDUsNCw3LDgsOQ=='); var_dump($res); // int(1)
4、问题
使用PHP preg_match方法进行正则校验提示PHP Warning: preg_match(): Unknown modifier ‘]’
$res = preg_match('/^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$/', 'MCwzLDIsNiwxLDUsNCw3LDgsOQ==');
原因是正则中带有/,不能使用/作为分隔符,可以使用#