标签归档:php

1.0版本发布

源码: https://coding.net/u/baozhuwanglei/p/blogBzw/git/tree/1.0/
基本具有基本的功能了
几个界面截图:
2017-01-06-17-27-16%e5%b1%8f%e5%b9%95%e6%88%aa%e5%9b%be

2017-01-06-17-27-00%e5%b1%8f%e5%b9%95%e6%88%aa%e5%9b%be

2017-01-06-17-26-40%e5%b1%8f%e5%b9%95%e6%88%aa%e5%9b%be

2017-01-06-17-26-27%e5%b1%8f%e5%b9%95%e6%88%aa%e5%9b%be

2017-01-06-17-26-07%e5%b1%8f%e5%b9%95%e6%88%aa%e5%9b%be

2017-01-06-17-25-20%e5%b1%8f%e5%b9%95%e6%88%aa%e5%9b%be

2017-01-06-17-24-58%e5%b1%8f%e5%b9%95%e6%88%aa%e5%9b%be

目前还有没安装功能,想要体验的同学可以手动创建数据库并且导入sql文件,sql文件在 public/static目录下。

接下来的开发计划:
1.*版本:会逐渐修复一些 bug,并且增加一些必要的功能,比如rss。
2.*版本:会进行代码重构,目前的代码混乱,很多地方没有用到 TP的特性。
然后在代码重构的基础上会增加一些功能:

  • 支持插件
  • 后台上传更换模板

诡异的bug终于解决 – 关于 tp5 apache2虚拟目录配置

我的习惯是在开发一个项目的时候新建一个虚拟主机的配置文件,用过 ubuntu的应该懂的,然后绑定一个 ***.localhost的本地域名。但是在开发项目的时候发现后台的一个图标怎么都加载不到,而同样的代码在办公室的电脑却一点没有问题,开始怀疑是apache2服务器的配置问题。

最后看了虚拟主机的配置,然后看了tp5手册,发现原来是url重写的那个配置:AllowOverride All,而我的配置为None,然后下面有一条手动的转发到 index.php的过滤:

RewriteRule !\.(php|htm|js|ico|gif|jpg|png|css|swf|pdf|doc|xls|txt|ppt|zip|rar)$ index.php

应该是其中js文件的问题,我用的是 beyondadmin,后台图标其实是字体文件。

把这行删除,然后 AllowOverride 设置为 All,问题解决。

关于登录功能的实现 TP5框架

在登录之后,一般除了服务器保存 Session之外,服务器还要在浏览器写入 cookie,这样当 Session过期之后,服务器就会验证浏览器发送过来的cookie,然后重新写入Session,来实现对用户透明的自动登录,这样就可以保持长时间的登录状态。

Session 很好理解,在服务器中,浏览器保存ID(多数以cookie的形式保存)相对来说是很安全的。问题出在 cookie中:

比较传统的实现方法是,把用户名和经过md5之后的密码放入浏览器的 cookie中,这样就算 cookie被盗,也不能通过 cookie知道密码,但是却能够登录进入,以下是我刚刚写的一般博客的登录逻辑:

这个是后台控制器都会继承的 common中的验证登录状态功能,首先验证 Session,如果有Session那么通过,下面的不执行,如果没有 Session,那么验证Cookie,如果验证Cookie通过,那么重新写入Session,之后跳转:

        //验证登录状态
        if (!Session::has('user_id') || !Session::has('user_name')) {
            //如果Session不存在则验证Cookie
            if (!Cookie::has('user_name') || !Cookie::has('user_password')) {
                $this->redirect('admin/login/login');
            } else {
                $data = ['name'=>Cookie::get('user_name'),'password'=>Cookie::get['user_password']];
                $result = $this->user->login($data);

                if ($result['code']==1) {
                  //补全Session
                    Session::set('user_id', $result['user']['id']);
                    Session::set('user_name', $result['user']['name']);
                } else {
                    $this->redirect('admin/login/login');
                }
            }
        }

以下为User 模型中验证用户名密码的的成员方法:

	/**
	 * 返回 1:登录成功 2:存在用户名 3:不存在用户名
	 *
	 * @param        $data   The data
	 */
	function login($data) {
		if ($res = $this->where('name',$data['name'])->find()) {
			if ($res['password']==$data['password']) {
				return ['code'=>1,'user'=>$res];
			}
			return ['code'=>2,'user'=>$res];
		}
		return ['code'=>3,'user'=>$res];
	}

这个是不是很简洁?也许这就是程序之美 🙂

最后是登录控制器的内容:

	//登录界面
	public function login() {
		//Cookie初始化
		Cookie::init(['prefix'=>'blogbwz_','expire'=>604800,'path'=>'/']);

		if (request()->isPost()) {
			$data = input('post.');
			$result = $this->user->login($data);

			if ($result['code'] == 1) {
				//登录成功写入session 和 cookie
				Session::set('user_id', $result['user']['id']);
				Session::set('user_name', $result['user']['name']);
				Cookie::set('user_name', $result['user']['name']);
				Cookie::set('user_password', $result['user']['password']);
				$this->success('登录成功!','/admin/index');
			} else {
				$this->error('用户名或者密码错误!');
			}
		}
		return $this->fetch();
	}

以下为参考文档:
方法一:
将用户的认证信息保证在一个cookie中,具体如下:
1.cookie名:uid。推荐进行加密,比如MD5(‘站点名称’)等。
2.cookie值:登录名|有效时间Expires|hash值。hash值可以由”登录名+有效时间Expires+用户密码(加密后的)的前几位 +salt”,salt是保证在服务器端站点配置文件中的随机数。
这样子设计有以下几个优点:
1.即使数据库被盗了,盗用者还是无法登录到系统,因为组成cookie值的salt是保证在服务器站点配置文件中而非数据 库。
2.如果账户被盗了,用户修改密码,可以使盗用者的cookie值无效。
3.如果服务器端的数据库被盗了,通过修改salt值可以使所有用户的cookie值无效,迫使用户重新登录系统。
4.有效时间Expires可以设置为当前时间+过去时间(比如2天),这样可以保证每次登录的cookie值都不一样,防止盗用者 窥探到自己的cookie值后作为后门,长期登录。

方法二:
每个用户登录之后生成一个随机的GUID,然后把GUID存在数据库里面(也可以考虑使用Redis,把用户信息和随机 GUID以KEY-VALUE方式存储 GUID-用户信息,存储时设置超时时间,比如20分钟,每次验证用户信息都自动延长20分 钟。如果用户选择记住登录,则设置时间为30天)。安全要求高的话,每次重新登录(包括用用户名密码和使用GUID)都 重新生成GUID,旧的作废,这样在新的地方登录之后旧的记住登录就自动失效。安全要求低的话可以每次都返回相同 的,直到用户修改密码之后让旧的GUID作废。用户Cookies里面没有直接和用户名、密码有关的内容,即使Cookies被盗 了也没法修改密码,原用户发现账号异常之后只要修改密码就可以防止盗号了。

另:防止XSS攻击,可以将Http-Only设置为True。