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

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。

关于分析PHP URL中特殊字符引起的问题(+,\\,=)的文章就分享到这,如果对你有帮助欢迎继续关注我们哦

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/41827.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
php学习php学习订阅用户
上一篇 2022年6月23日 16:31
下一篇 2022年6月23日 16:31

相关推荐

  • php如何使用Behat进行BDD测试。

    Behat是一种基于行为驱动开发(BDD)的测试框架,主要用于测试PHP应用程序的功能和行为。Behat不仅可以使测试更加简单、可读和可维护,同时也非常容易集成到各种PHP框架中。在本文中,我们将介绍Behat的基本概念和语…

    2023年6月3日
    04
  • PHP与数据库性能调优的集成。

    随着互联网技术的飞速发展,数据库是网站开发中必不可少的一部分。而PHP是目前最常用的服务器端语言之一,它的高效性能和便捷的开发方式已经被广泛认可。但是,即使是最流行的技术也有其局限性,数据库性能问题是PH…

    2023年5月21日
    01
  • 小编教你php字符串长度。

    在PHP中,获取字符串的长度是一个常见的需求,我们可以使用内置的`strlen()`函数来实现这个功能,`strlen()`函数返回一个字符串的长度(以字节为单位),如果字符串包含多字节字符(例如某些特殊符号),则返回的长度可…

    2024年6月20日
    02
  • 通过php操作mysql来创建数据库(附代码)

    创建数据库 此操作页面的html代码如下: 添加数据库 数据库名 操作 php07 修改 删除 这时我们需要建立一个用户提交数据库名的表单的htnl页面 代码如下: 标题 数据库名: 最后是一个接收用户提交数据并处理的页面 p…

    2018年3月14日
    0257
  • PHP递归思想说明

    说明:在一个函数内部再次有条件调用自己(当前函数),这个时候就称为“递归调用”,即自己调用自己。 代码 图解 注意: 递归调用必须有一个可以退出的条件,否则无法退出递归调用,就会成死归,也就是说必须逐渐的退…

    2018年4月7日
    0193
  • PHP与数据库安全性的集成。

    随着网络技术的不断进步,数据库已经成为了各种网站和应用程序的核心之一。为了确保数据库中的数据得到充分保护,开发人员必须确保他们的应用程序和数据库系统之间的集成是安全的。PHP是一种常用的编程语言,也是许…

    2023年5月21日
    00
  • PHP直播功能开发教程:项目实战。

    随着社交媒体的流行和直播行业的兴起,越来越多的企业和机构需要开发自己的直播功能。作为一种流行的后端语言,PHP已经成为目前许多直播项目的开发首选。本文将结合项目实战,为大家分享PHP直播功能开发的技巧和经…

    2023年5月28日
    03
  • PHP 管理全局的方法

    【相关学习推荐:php编程(视频)】管理全局状态在命令式语言中总是需要一些全局空间。在编程 PHP 或扩展时,我们将明确区分我们所称的请求绑定全局变量和真正的全局变量。请求全局变量是处理请求过程中需要携带和…

    2022年6月19日
    0123

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息