mysql_* functions have been removed from PHP7. You’ll need to translate your code to use PDO or mysqli instead. – aynber Jul 18 ’16 at 15:57
标签归档:php
消防回路编码的服务器端源码
1.0版本发布
源码: https://coding.net/u/baozhuwanglei/p/blogBzw/git/tree/1.0/
基本具有基本的功能了
几个界面截图:
目前还有没安装功能,想要体验的同学可以手动创建数据库并且导入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。