小編給大家分享一下PHP URL中特殊字符引起的問題分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)公司專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、云安網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站、商城系統(tǒng)網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為云安等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。PHP中URL中特殊字符引起的問題(+,,=)
前言,在做某個渠道的過程中,發(fā)現(xiàn)一個驗簽錯誤的問題。但是,當(dāng)時驗簽在兩個地方表現(xiàn)不一致,同一套處理方法,想到了這是因為兩個地方請求方式是不同的一個get方法另外一個自然是post方法。當(dāng)然,出問題肯定就是get。
GET和POST
GET請求方式,由于是將參數(shù)放在URL中,所以在進(jìn)行傳遞的時候可能會受到瀏覽器端的一些策略問題,對參數(shù)進(jìn)行urlencode處理。所以,當(dāng)你在服務(wù)端拿到參數(shù)的時候可能并不是原始的數(shù)據(jù)。因此,在通過GET方式請求拿到數(shù)據(jù),如果不做任何處理的話去驗簽可能會存在問題。這邊的可能就是當(dāng)base64處理之后不含+這個特殊的字符,+在GET方式之后不做任何處理拿到的就是一個空白字符串。
POST請求方式,是將參數(shù)放在request body中,在進(jìn)行http傳遞的過程中不會存在由于瀏覽器的一些策略問題對參數(shù)進(jìn)行任何的處理。因此,通過POST請求進(jìn)行參數(shù)驗簽的時候不會存在問題,能夠很順利的進(jìn)行驗簽。但是,我們沒有辦法去要求渠道商將get請求變成post請求,因此我們只能自己想辦法。
urlencode和urldecode
urlencode: (PHP 4, PHP 5, PHP 7) urlencode — 編碼 URL 字符串 string urlencode ( string $str )
此函數(shù)便于將字符串編碼并將其用于 URL 的請求部分,同時它還便于將變量傳遞給下一頁。
return
返回字符串,此字符串中除了 -_. 之外的所有非字母數(shù)字字符都將被替換成百分號(%)后跟兩位十六進(jìn)制數(shù),空格則編碼為加號(+)。此編碼與 WWW 表單 POST 數(shù)據(jù)的編碼方式是一樣的,同時與 application/x-www-form-urlencoded 的媒體類型編碼方式一樣
urldecode: (PHP 4, PHP 5, PHP 7)
urldecode — 解碼已編碼的 URL 字符串
string urldecode ( string $str )
解碼給出的已編碼字符串中的任何 %##。 加號('+')被解碼成一個空格字符。
返回解碼后的字符串。
好像我們看到了曙光,對+這個會變成空格的字符串的"完美處理方式"。那就是,對簽名字符串進(jìn)行urlencode進(jìn)行加密處理。然后,興高采烈的去驗證,fxxk,false。還是不通過,然后甩自己一個耳光。base64加密之后會出現(xiàn)=這個補(bǔ)位字符串,很蛋疼。于是我就想了一個臨時處理方式。
urlencode(substr($str,0,strlen($sign)-2)).substr($sign,strlen($sign)-2)
當(dāng)時,考慮到base64最多出現(xiàn)兩個==,所以在最后兩個不進(jìn)行urlencode處理。這個基本上能夠處理,但是可能存在一個問題,那就是在最后兩位出現(xiàn)+也是不行的,果然這個方案不能說服自己,推翻。并且在這個過程還發(fā)現(xiàn)一個問題就是,傳過來的簽名字符串還有可能會已經(jīng)經(jīng)過urlencode處理。這個還是一個小問題,先進(jìn)行urldecode處理,因為decode不會引起誤會。
當(dāng)時,小伙伴提出一個解決辦法,那就是直接替換+號不就可以了嗎?的確,這是一個辦法。但是我認(rèn)為這個辦法很挫,如果以后加密算法改變了或者增加了其他特殊字符呢,比如@#¥%……&**( 等這些,我們不可能都去匹配替換什么的。所以,我同意臨時方案處理,但是我繼續(xù)想。
rawurlencode和rawurldecode
rawurlencode: (PHP 4, PHP 5, PHP 7)
rawurlencode — 按照 RFC 3986 對 URL 進(jìn)行編碼
string rawurlencode ( string $str )
根據(jù) ? RFC 3986 編碼指定的字符。
rawurldecode: (PHP 4, PHP 5, PHP 7)
rawurldecode — 對已編碼的 URL 字符串進(jìn)行解碼
string rawurldecode ( string $str )
返回字符串,此字符串中百分號(%)后跟兩位十六進(jìn)制數(shù)的序列都將被替換成原義字符。
新的曙光出現(xiàn)了,理解rawurldecode,替換成原義字符。所以,解決方案呼之欲出了。
rawurldecode(urlencode(urldecode($sign))));
初看上去覺得還臃腫或者為什么要這么繞來繞去處理呢?其實你還真得這么處理,至于為什么,請看上上面的吹牛逼。
以上是PHP URL中特殊字符引起的問題分析的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!