资讯专栏INFORMATION COLUMN

PHP中URL中特殊字符引起的问题(+,,=)

RancherLabs / 3263人阅读

摘要:中中特殊字符引起的问题前言,在做某个渠道的过程中,发现一个验签错误的问题。对已编码的字符串进行解码返回字符串,此字符串中百分号后跟两位十六进制数的序列都将被替换成原义字符。

PHP中URL中特殊字符引起的问题(+,,=)

前言,在做某个渠道的过程中,发现一个验签错误的问题。但是,当时验签在两个地方表现不一致,同一套处理方法,想到了这是因为两个地方请求方式是不同的一个get方法另外一个自然是post方法。当然,出问题肯定就是get。

GET和POST

GET请求方式,由于是将参数放在URL中,所以在进行传递的时候可能会受到浏览器端的一些策略问题,对参数进行urlencode处理。所以,当你在服务端拿到参数的时候可能并不是原始的数据。因此,在通过GET方式请求拿到数据,如果不做任何处理的话去验签可能会存在问题。这边的可能就是当base64处理之后不含+这个特殊的字符,+在GET方式之后不做任何处理拿到的就是一个空白字符串。

POST请求方式,是将参数放在request body中,在进行http传递的过程中不会存在由于浏览器的一些策略问题对参数进行任何的处理。因此,通过POST请求进行参数验签的时候不会存在问题,能够很顺利的进行验签。但是,我们没有办法去要求渠道商将get请求变成post请求,因此我们只能自己想办法。

urlencode和urldecode

urlencode:

(PHP 4, PHP 5, PHP 7)
urlencode — 编码 URL 字符串
string urlencode ( string $str )
此函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页。

return
返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样

urldecode:

(PHP 4, PHP 5, PHP 7)
urldecode — 解码已编码的 URL 字符串

string urldecode ( string $str )
解码给出的已编码字符串中的任何 %##。 加号("+")被解码成一个空格字符。

返回解码后的字符串。

好像我们看到了曙光,对+这个会变成空格的字符串的"完美处理方式"。那就是,对签名字符串进行urlencode进行加密处理。然后,兴高采烈的去验证,fxxk,false。还是不通过,然后甩自己一个耳光。base64加密之后会出现=这个补位字符串,很蛋疼。于是我就想了一个临时处理方式。

urlencode(substr($str,0,strlen($sign)-2)).substr($sign,strlen($sign)-2)

当时,考虑到base64最多出现两个==,所以在最后两个不进行urlencode处理。这个基本上能够处理,但是可能存在一个问题,那就是在最后两位出现+也是不行的,果然这个方案不能说服自己,推翻。并且在这个过程还发现一个问题就是,传过来的签名字符串还有可能会已经经过urlencode处理。这个还是一个小问题,先进行urldecode处理,因为decode不会引起误会。

当时,小伙伴提出一个解决办法,那就是直接替换+号不就可以了吗?的确,这是一个办法。但是我认为这个办法很挫,如果以后加密算法改变了或者增加了其他特殊字符呢,比如@#¥%……&**( 等这些,我们不可能都去匹配替换什么的。所以,我同意临时方案处理,但是我继续想。

rawurlencode和rawurldecode

rawurlencode:

(PHP 4, PHP 5, PHP 7)
rawurlencode — 按照 RFC 3986 对 URL 进行编码

string rawurlencode ( string $str )
根据 » RFC 3986 编码指定的字符。

rawurldecode:

(PHP 4, PHP 5, PHP 7)
rawurldecode — 对已编码的 URL 字符串进行解码

string rawurldecode ( string $str )

返回字符串,此字符串中百分号(%)后跟两位十六进制数的序列都将被替换成原义字符。

新的曙光出现了,理解rawurldecode,替换成原义字符。所以,解决方案呼之欲出了。

rawurldecode(urlencode(urldecode($sign))));

初看上去觉得还臃肿或者为什么要这么绕来绕去处理呢?其实你还真得这么处理,至于为什么,请看上上面的吹牛逼。

后记

作为程序员,我们必须要有两手准备,一手临时方案,能够快速修复现在问题。在生产环境恢复正常,但是从长远来看必须要能够一个稳定可靠的方案。方案来源于你不断的尝试和php.net。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25712.html

相关文章

  • web开发URL编码简介

    摘要:大部分需要编码的原因是由于有特殊字符如等或者参数是中文形式。不会被此方法编码的字符重点因此,对于中文字符串来说,如果不希望把字符串编码格式转化成格式的比如原页面和目标页面的是一致的时候,只需要使用。 一、为什么要 urlencode()? 因为当字符串数据以url的形式传递给web服务器时,字符串中是不允许出现空格和特殊字符的。 也就是说,url的参数传递的时候,需要遵循一定的url...

    forsigner 评论0 收藏0
  • web开发URL编码简介

    摘要:大部分需要编码的原因是由于有特殊字符如等或者参数是中文形式。不会被此方法编码的字符重点因此,对于中文字符串来说,如果不希望把字符串编码格式转化成格式的比如原页面和目标页面的是一致的时候,只需要使用。 一、为什么要 urlencode()? 因为当字符串数据以url的形式传递给web服务器时,字符串中是不允许出现空格和特殊字符的。 也就是说,url的参数传递的时候,需要遵循一定的url...

    xiao7cn 评论0 收藏0
  • web安全基础

    摘要:安全基础常见的安全攻击手段有很多,比如注入,,,头攻击,攻击,重定向攻击,上传文件攻击等,其中大多数都可以通过三种方法过滤代理转义实体化来解决。个人趋向于安全狗,同时安装服务器安全狗和网站安全狗可以有效地防护攻击。 web安全基础 常见的web安全攻击手段有很多,比如SQL注入,XSS,CSRF,HTTP头攻击,cookie攻击,重定向攻击,上传文件攻击等,其中大多数都可以通过三种方法...

    starsfun 评论0 收藏0
  • PHP_在线支付

    摘要:支付平台支付成功后,会往网站的某个回调发送数据。回调接收数据并根据队则,生成检验串,并判断合法性。返回散列值字符串。 基本介绍 用途广泛,很多网站都继承了在线支付功能,如paypal,网银在线,易宝支付,支付宝,快钱等第三方平台. 原理 基本上,每个银行都有自家的支付接口,为什么不直接连接到银行的接口去支付,而需要通过第三方支付? 银行众多,每家的银行用的技术不一样,比如招行使用.n...

    Channe 评论0 收藏0

发表评论

0条评论

RancherLabs

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<