phpwind8.7 新下载的程序,安装后前台正常登录,后台死活登录不上。
看了一下安装程序之后,终于明白了原因。
分析过程
密码写入过程
install.php 中- InitGP(array('dbhost','dbuser','dbpw','dbname','database','PW','manager','manager_pwd','manager_ckpwd','manager_email'));
复制代码 InitGP 定义在 require/common.php- function InitGP($keys, $method = null, $cvtype = 1) {
- S::gp($keys, $method, $cvtype);
- }
复制代码 class S 是在 require/security.php
gp 方法调用的是 S::escapeChar
escapeChar 最后调用的是 S::escapeStr
那么具体看一下 escapeStr 这个方法- function escapeStr($string) {
- $string = str_replace(array("\0","%00","\r"), '', $string); //modified@2010-7-5
- $string = preg_replace(array('/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/','/&(?!(#[0-9]+|[a-z]+);)/is'), array('', '&'), $string);
- $string = str_replace(array("%3C",'<'), '<', $string);
- $string = str_replace(array("%3E",'>'), '>', $string);
- $string = str_replace(array('"',"'","\t",' '), array('"',''',' ',' '), $string);
- return $string;
- }
复制代码 这里有进行一些替换操作,例如会被替换成所以,密码里如果有类似 & > < 等将会被替换
密码校验过程
a、前台校验
login.php 中接受参数和安装过程中写入时接受时相同,都做了替换- S::gp(array('pwuser','pwpwd','question','customquest','answer','cktime','hideid','jumpurl','lgt','keepyear', 'ajax', 'ajaxstep'),'P');
复制代码 b、后台校验
admin/admincp.php 接受参数对密码并未替换,而是直接使用 $_POST['admin_pwd']- $CK = array($timestamp,$_POST['admin_name'],md5(PwdCode(md5($_POST['admin_pwd'])).$timestamp.getHashSegment()),$safecv);
复制代码 所以后台登录不上。
解决方案
方案一、调整文件记录的 md5 码,好处:以后升级不会再次出现后台登录不上,不方便:需要找个地方生成 md5 码
操作
打开 http://www.cmd5.com/
在 密文 栏输入密码,下方出现 md5(1>,32) =
复制32位的 md5 码
打开 data/sql_config.php
找到- $manager_pwd = array('*********');
复制代码 将两个单引号内容替换成刚才生成的 md5
方案二、临时修改,让后台的校验和前台的一样
打开 admin/admincp.php
找到- if ($_POST['admin_pwd'] && $_POST['admin_name']) {
复制代码 在下面加一行- S::gp('admin_pwd');$_POST['admin_pwd'] = $admin_pwd;
复制代码 最后
还是建议 phpwind 将两处校验修改成一样的方式,以避免今后带来的不便 |