一个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的一些特殊符号,在存数据库以前须要被转义,在取出数据库后,须要被转换回来,这也是一个很重要的知识点。