关于DZ7.0密码加密方式以及登录验证

今天下午5点的时候将电脑搬到了点击工作室。

上次做那个留言版,主要的是要求以DZ数据库的成员表进行登录验证,这是最麻烦的一点,上次写的那个与DZ的整合,谈谈 说有问题,我一看,嘿,还真有问题,主要是验证通不过,那就是与DZ的整合问题了。我查了一些资料,最后找到了原因。

从DZ6.0开始,会员的帐号密码等等信息都是存放在UC数据库中的,而discuz数据库members表中的password数据拿来没什么用,估计是为了兼容以前旧的程序的查询而没有删除的吧。

$password = md5(random(10));
复制代码将一个乱数转成md5, 然后下一行就是执行写入SQL. 强悍吧, 论坛数据表中的密码md5,其实是假象.一点作用都没有.

并且关于UC数据库中PASSWORD的形成是md5(md5(‘password’),alt),就是说经过了两次md5加密,第一次直接将密码加密,第二次加了一个随即字符串salt然后md5加密。并且这个随即的字符串salt是保存在uc_members表中的。于是我的验证是这么的:

 
            $dz_db_obj=new DB($config[‘discuz’][‘hostname’],$config[‘discuz’][‘username’],$config[‘discuz’][‘password’]);
            $dz_db_obj->select_db($config[‘discuz’][‘database’],’gbk’);
            $dz_db_obj->die_error=true;

            $name=iconv(‘utf-8′,’gbk’,deal_chars($_POST[‘name’]));
            $password=deal_chars($_POST[‘password’]);
           
            $sql_result=$dz_db_obj->query("SELECT count(1) FROM uc_members WHERE username=’$name’ and password=md5(concat(md5(‘$password’),salt))");
            $row=$dz_db_obj->fetch_assoc($sql_result);

            if($row)
            {
                $row[‘username’]=$_POST[‘name’];
                $_SESSION[‘user’]=$row;

                //设置用户COOKIE信息
                {
                    //DZ里面的用户数据
                    setcookie(‘user_name’,$_SESSION[‘user’][‘username’],time()+60*60*24*356,’/’);
                }
               
                head_show(‘reload’,"欢迎回来 <span style=’color:red;’>{$row[‘username’]}</span> ~~");
            }
            else
            {
                head_show(‘error’,’用户名或密码不正确~~’);
            }

PHP的SPL(Standard PHP Library)简介

SPL(Standard PHP Library)简介
 
php5以后的版本引入了SPL(Standard PHP Library)。这个库定义了很多有用的接口和类以及少量函数(例如spl_autoload),功能非常强大。大家可以通过print_r(spl_classes());来打印出自己的php版本所支持的所有spl类和接口。

目前已经有不少项目(例如ZF)应用了spl,所以学习spl是很有必要的。
 

这里介绍几个常用的spl类和接口。

 

一、Countable
count是php最常用的函数之一,在早期的php版本,count只能用于计算数组的单元数目,对于其他类型包括对象count的返回值都是1(NULL除外,count(NULL)返回0),在php5以后,我们可以通过让对象实现Countable接口来定义count的调用。
Countable接口只有一个公用的成员方法count()。
 
举个例子:
<?php
class A implements Countable
{
    private $var = array(1, 2, 3);
   
    public function count()
    {
        return count($this->var);
    }
}
$a = new A;
echo count($a);
本例将输出 3 。

 

二、ArrayObject
ArrayObject是数组的封装类,它能够把数组转成对象存储。举个例子:
<?php
$arr = array(
    ‘a’ => 1,
    ‘b’ => ‘str’,
    ‘c’ => array(1)
);
$obj = new ArrayObject($arr);
var_dump($obj);
$arr2 = $obj->getArrayCopy(); // 返回对象的公用成员变量数组
print_r($arr2);

本例将输出:
object(ArrayObject)#1 (3) {
["a"]=>
int(1)
["b"]=>
string(3) “str”
["c"]=>
array(1) {
    [0]=>
    int(1)
}
}
Array
(
    [a] => 1
    [b] => str
    class=”lang:c decode:true ” => Array
        (
            [0] => 1
        )

)

 

三、IteratorAggregate
对象的原始迭代器接口是Iterator,不过这个接口定义的公用方法有好几个:
current()
key()
next()
rewind()
valid()
用起来稍微有点不方便,所以spl同时提供了一个简化版的或者说集成版的迭代器接口IteratorAggregate。
这个接口只有一个公用方法
Iterator getIterator()
这个方法需要返回的是对象的Iterator。
上面提到的ArrayObject类就是实现了IteratorAggregate接口的,举个例子:
<?php
class A implements IteratorAggregate
{
    private $var = array(1, 2, 3);
   
    public function getIterator()
    {
        return new ArrayObject($this->var);
    }
}
$a = new A();
foreach ($a as $b) {
    echo "$b ";
}
本例将输出:
1
2
3

 

查看更多的类和接口可以访问

PHP和Python/Ruby运行机制的本质区别

以下只是一些个人看法:

PHP和Python/Ruby的运行机制有一个本质区别:PHP是每次HTTP请求过来以后,初始化全部资源(例如创建数据库链接、加载系统类库,创建缓存等等),处理完毕,释放全部资源,这不像Python/Ruby之类带有GC的脚本语言,Python/Ruby是初次启动的时候初始化资源,随后的请求就不必再次初始化资源了。

这种机制的差异带来的区别就是:

1、PHP极难出现严重的内存泄露问题,随便你代码写的多烂,反正每个请求一执行完毕,所有资源统统释放光。而Python/Ruby则需要依赖GC来回收内存,因此稍有不慎,还是会出现GC无法释放的内存泄露问题。

2、PHP每次请求都要初始化资源,这个开销非常大。所以尽管PHP解析器本身的运行速度是极快的,但是一旦使用复杂的PHP框架,那么由于需要每次请求的时候初始化整个框架,性能的下降非常厉害,你用一个很复杂的PHP框架的结果就是整体性能被Ruby远远甩开。这也是为什么PHP社区这么多年来,并不怎么倾向于使用框架的原因之一。

3、由于PHP这种每请求初始化资源的机制,也造成了PHP添加跨请求的高级特性相当困难,这是PHP本身一个很大的限制,但是反过来说,正是这种限制使得PHP始终保持在一个比较简单的web语言上面,而正是这一点才是PHP得以成为互联网第一Web编程语言的原因,因此也未必就不好。

总之,PHP和Ruby的差异还是很大的,不适合放在一起比较,其实应该比较的是Ruby和Python才对。

所以我觉得Rails这种框架性做法被PHP跟风以后,其实是把PHP带上了邪路,所以不如说是Rails在误导PHP的发展。顺便多说一句:DHH在编写basecamp之前,一直是用PHP的,并且自己还写了一个PHP的快速开发框架,他改用ruby以后,把当初自己写的PHP框架也移植过来了,这个框架实际上是Rails最初的原型。那么为什么DHH当初不直接基于PHP做Rails呢?非要改用ruby以后,才发表rails呢?你看看PHP这种运行机制就知道了,PHP做复杂的web开发框架并不是一条光明的道路。

相关连接: http://www.javaeye.com/post/853931?page=1