一個wordpress下轉義符的怪事及解決方法

前幾天,有漁老師去現場爲一位朋友解決一個網站註冊驗證的問題。問題是這樣的:在朋友的網站用郵箱註冊後,系統會發一封郵件到郵箱,而後點擊連接設置帳號的初始化密碼。以下圖所示:php

wKiom1gZYjOxwH9VAAA2rWL6tT4931.png

但我點擊這個連接後,wordpress一直提示invalid key,也就是說key錯誤。由於是wordpress框架,從url的路由看,我就打開wp-login.php,而後查看其中的action rp。我直觀感受,應該是get url中的key跟數據庫中的key值不相等致使的。因此,想進入系統的mysql一查究竟,但遺憾的是居然沒有mysql權限,我也不知道他的網站是讓誰作的,估計是個外包吧。由於朋友是不懂技術的,不少事情問他也是一問三不知。沒辦法,哪就本身悶頭搞吧。html

外事不決問google,內事不決問baidu。我習慣性地打開baidu,輸入:wordpress新用戶註冊 key無效。發現碰到相似問題的同行也很多,且看他們是如何解決的?他們的建議是:mysql

編輯wp-includes文件夾中的pluggable.php文件,把變量$message裏的>符合去掉。我照作了,發現仍是不行的哦。因此,網上的東西,不少都得本身再實踐下,不然是要被坑的。但到這一步,我更加確信是key的值出問題了。而後我又仔細看了下郵件發送過來的連接,發現這個連接有個問題。sql

wKioL1gZYmbSUKaCAABMdLpXdPA952.png

這個連接裏的&是&被轉義後的值。那麼,我在瀏覽器裏輸入時把&替換成&會怎樣呢?發現居然OK了,這時密碼重置成功了。這樣,問題就好辦了,理論上,我只要修改pluggable.php,把&替換成&就能夠了。$message的變量賦值以下:數據庫

$message .= ‘<‘ . network_site_url(「wp-login.php?action=rp&key=$key&login=」 . rawurlencode($user->user_login), ‘login’) . 「>\r\n\r\n」;瀏覽器

但問題是,我用htmlspecialchars_decode($message)處理也不行,用str_replace("&amp;","&",$message)處理也不行。也就是說,這個&amp;替換不成&。框架

我再看這$message變量,rp後面的&怎麼沒被轉義,而$key後面的&卻被轉義了。因此,到這一步,我就懷疑是否是語句的順序有問題?而後,我就把&key=$key放到($user->user_login)後面。而後,根據前面baidu的一些意見,順便把<和>符合也去掉。這樣,修改後的message以下:ide

$message .= network_site_url(「wp-login.php?action=rp&login=」 . rawurlencode($user->user_login)."&key=$key", ‘login’) . 「\r\n\r\n」;wordpress

問題就這樣解決了。網站

總結:1,出現問題,問baidu通常都能找到一些建議。但這些建議不必定徹底正確,本身還得根據實際狀況修改。2,html的一些特殊符號,在存數據庫以前須要被轉義,在取出數據庫後,須要被轉換回來,這也是一個很重要的知識點。

相關文章
相關標籤/搜索