摘要:中中特殊字符引起的問題前言,在做某個(gè)渠道的過程中,發(fā)現(xiàn)一個(gè)驗(yàn)簽錯(cuò)誤的問題。對已編碼的字符串進(jìn)行解碼返回字符串,此字符串中百分號后跟兩位十六進(jìn)制數(shù)的序列都將被替換成原義字符。
PHP中URL中特殊字符引起的問題(+,,=)
GET和POST前言,在做某個(gè)渠道的過程中,發(fā)現(xiàn)一個(gè)驗(yàn)簽錯(cuò)誤的問題。但是,當(dāng)時(shí)驗(yàn)簽在兩個(gè)地方表現(xiàn)不一致,同一套處理方法,想到了這是因?yàn)閮蓚€(gè)地方請求方式是不同的一個(gè)get方法另外一個(gè)自然是post方法。當(dāng)然,出問題肯定就是get。
GET請求方式,由于是將參數(shù)放在URL中,所以在進(jìn)行傳遞的時(shí)候可能會(huì)受到瀏覽器端的一些策略問題,對參數(shù)進(jìn)行urlencode處理。所以,當(dāng)你在服務(wù)端拿到參數(shù)的時(shí)候可能并不是原始的數(shù)據(jù)。因此,在通過GET方式請求拿到數(shù)據(jù),如果不做任何處理的話去驗(yàn)簽可能會(huì)存在問題。這邊的可能就是當(dāng)base64處理之后不含+這個(gè)特殊的字符,+在GET方式之后不做任何處理拿到的就是一個(gè)空白字符串。
POST請求方式,是將參數(shù)放在request body中,在進(jìn)行http傳遞的過程中不會(huì)存在由于瀏覽器的一些策略問題對參數(shù)進(jìn)行任何的處理。因此,通過POST請求進(jìn)行參數(shù)驗(yàn)簽的時(shí)候不會(huì)存在問題,能夠很順利的進(jìn)行驗(yàn)簽。但是,我們沒有辦法去要求渠道商將get請求變成post請求,因此我們只能自己想辦法。
urlencode和urldecodeurlencode:
(PHP 4, PHP 5, PHP 7) urlencode — 編碼 URL 字符串 string urlencode ( string $str ) 此函數(shù)便于將字符串編碼并將其用于 URL 的請求部分,同時(shí)它還便于將變量傳遞給下一頁。 return 返回字符串,此字符串中除了 -_. 之外的所有非字母數(shù)字字符都將被替換成百分號(%)后跟兩位十六進(jìn)制數(shù),空格則編碼為加號(+)。此編碼與 WWW 表單 POST 數(shù)據(jù)的編碼方式是一樣的,同時(shí)與 application/x-www-form-urlencoded 的媒體類型編碼方式一樣
urldecode:
(PHP 4, PHP 5, PHP 7) urldecode — 解碼已編碼的 URL 字符串 string urldecode ( string $str ) 解碼給出的已編碼字符串中的任何 %##。 加號("+")被解碼成一個(gè)空格字符。 返回解碼后的字符串。
好像我們看到了曙光,對+這個(gè)會(huì)變成空格的字符串的"完美處理方式"。那就是,對簽名字符串進(jìn)行urlencode進(jìn)行加密處理。然后,興高采烈的去驗(yàn)證,fxxk,false。還是不通過,然后甩自己一個(gè)耳光。base64加密之后會(huì)出現(xiàn)=這個(gè)補(bǔ)位字符串,很蛋疼。于是我就想了一個(gè)臨時(shí)處理方式。
urlencode(substr($str,0,strlen($sign)-2)).substr($sign,strlen($sign)-2)
當(dāng)時(shí),考慮到base64最多出現(xiàn)兩個(gè)==,所以在最后兩個(gè)不進(jìn)行urlencode處理。這個(gè)基本上能夠處理,但是可能存在一個(gè)問題,那就是在最后兩位出現(xiàn)+也是不行的,果然這個(gè)方案不能說服自己,推翻。并且在這個(gè)過程還發(fā)現(xiàn)一個(gè)問題就是,傳過來的簽名字符串還有可能會(huì)已經(jīng)經(jīng)過urlencode處理。這個(gè)還是一個(gè)小問題,先進(jìn)行urldecode處理,因?yàn)閐ecode不會(huì)引起誤會(huì)。
當(dāng)時(shí),小伙伴提出一個(gè)解決辦法,那就是直接替換+號不就可以了嗎?的確,這是一個(gè)辦法。但是我認(rèn)為這個(gè)辦法很挫,如果以后加密算法改變了或者增加了其他特殊字符呢,比如@#¥%……&**( 等這些,我們不可能都去匹配替換什么的。所以,我同意臨時(shí)方案處理,但是我繼續(xù)想。
rawurlencode和rawurldecoderawurlencode:
(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))));
初看上去覺得還臃腫或者為什么要這么繞來繞去處理呢?其實(shí)你還真得這么處理,至于為什么,請看上上面的吹牛逼。
后記作為程序員,我們必須要有兩手準(zhǔn)備,一手臨時(shí)方案,能夠快速修復(fù)現(xiàn)在問題。在生產(chǎn)環(huán)境恢復(fù)正常,但是從長遠(yuǎn)來看必須要能夠一個(gè)穩(wěn)定可靠的方案。方案來源于你不斷的嘗試和php.net。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/25712.html
摘要:大部分需要編碼的原因是由于有特殊字符如等或者參數(shù)是中文形式。不會(huì)被此方法編碼的字符重點(diǎn)因此,對于中文字符串來說,如果不希望把字符串編碼格式轉(zhuǎn)化成格式的比如原頁面和目標(biāo)頁面的是一致的時(shí)候,只需要使用。 一、為什么要 urlencode()? 因?yàn)楫?dāng)字符串?dāng)?shù)據(jù)以url的形式傳遞給web服務(wù)器時(shí),字符串中是不允許出現(xiàn)空格和特殊字符的。 也就是說,url的參數(shù)傳遞的時(shí)候,需要遵循一定的url...
摘要:大部分需要編碼的原因是由于有特殊字符如等或者參數(shù)是中文形式。不會(huì)被此方法編碼的字符重點(diǎn)因此,對于中文字符串來說,如果不希望把字符串編碼格式轉(zhuǎn)化成格式的比如原頁面和目標(biāo)頁面的是一致的時(shí)候,只需要使用。 一、為什么要 urlencode()? 因?yàn)楫?dāng)字符串?dāng)?shù)據(jù)以url的形式傳遞給web服務(wù)器時(shí),字符串中是不允許出現(xiàn)空格和特殊字符的。 也就是說,url的參數(shù)傳遞的時(shí)候,需要遵循一定的url...
摘要:安全基礎(chǔ)常見的安全攻擊手段有很多,比如注入,,,頭攻擊,攻擊,重定向攻擊,上傳文件攻擊等,其中大多數(shù)都可以通過三種方法過濾代理轉(zhuǎn)義實(shí)體化來解決。個(gè)人趨向于安全狗,同時(shí)安裝服務(wù)器安全狗和網(wǎng)站安全狗可以有效地防護(hù)攻擊。 web安全基礎(chǔ) 常見的web安全攻擊手段有很多,比如SQL注入,XSS,CSRF,HTTP頭攻擊,cookie攻擊,重定向攻擊,上傳文件攻擊等,其中大多數(shù)都可以通過三種方法...
摘要:支付平臺支付成功后,會(huì)往網(wǎng)站的某個(gè)回調(diào)發(fā)送數(shù)據(jù)。回調(diào)接收數(shù)據(jù)并根據(jù)隊(duì)則,生成檢驗(yàn)串,并判斷合法性。返回散列值字符串。 基本介紹 用途廣泛,很多網(wǎng)站都繼承了在線支付功能,如paypal,網(wǎng)銀在線,易寶支付,支付寶,快錢等第三方平臺. 原理 基本上,每個(gè)銀行都有自家的支付接口,為什么不直接連接到銀行的接口去支付,而需要通過第三方支付? 銀行眾多,每家的銀行用的技術(shù)不一樣,比如招行使用.n...
閱讀 1952·2021-09-30 09:46
閱讀 1365·2019-08-30 15:43
閱讀 1122·2019-08-29 13:28
閱讀 1921·2019-08-29 11:24
閱讀 1681·2019-08-26 13:22
閱讀 3892·2019-08-26 12:01
閱讀 1816·2019-08-26 11:33
閱讀 3242·2019-08-23 15:34