0x00 前言
安全的基础是开发。本次会详细讲解该项目的过程和心路。
0X01 配置
- 本次在windows上安装ThinkPHP8.0稳定版,附上教程:
https://blog.csdn.net/weixin_62797596/article/details/134713455
- 将
.example.env
修改成.env
,文件内容一并修改。
0x02 思路
本项目体量不大,但仍然尝试MVC模型。从控制层入手,具体的业务教给模型层,最后视图层呈现结果。
实现注册,登录,留言,注销四个功能。
注册,登录,注销都属于用户操作,给UsersController
看留言与写留言属于留言操作,给MessagesController
本项目需要两个表:
users
id |
username |
password |
1 |
Pax |
123456 |
messages
id |
username |
messages |
1 |
Pax |
FIag |
对应的两个模型层:users.php
和messages.php
对应的视图层文件用到再说。
0x03 实现
登录
步骤
在数据库(mb
)里建表users
并写入一行数据(如上表所示)。
.env
已经拉好配置了,数据库可以连上。
app->controller->users.php
文件写入login()
方法:

app->common.php
文件里写入函数post_xss

这里的$users
是model
的users
的实例化

view->users->login.php
文件看看表单即可:

最后写入路由:

小结
控制器先写,模型层再实现,视图层展现,最后配上路由。
注册
先写控制层:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public function register() {
if ($this->request->isPost()) { $data = common\post_xss($this->request->post('username'), $this->request->post('password')); if (empty($data['username']) || empty($data['password'])){ echo "<script>alert('信息输入不全');</script>"; return View::engine('php')->fetch('register'); }else{ $users = new users(); return $users->register($data['username'], $data['password']); } }else{ return View::engine('php')->fetch('register'); } }
|
再写模型层:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public function register($username, $password) { echo '已到达model的register'; $table = Db::table('users')->where('username', $username)->find(); if(!empty($table['username'])) { echo "<script>alert('用户已存在');</script>"; return View::engine('php')->fetch('register'); } $data = [ 'username' => $username, 'password' => $password ]; Db::name('users')->insert($data); echo "<script>alert('注册成功');</script>"; return View::engine('php')->fetch('login'); }
|
然后是视图层:

配路由按照上面格式即可
留言
给出控制层
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class MessagesController extends BaseController { public function show() { $username = Session::get('username'); $password = Session::get('password'); if(isset($username) && isset($password)) { $messages = new messages(); $data = $messages->show(); }else{ echo "<script>alert('你是怎么进来的,hacker?');</script>";; View::engine('php')->fetch('hacker'); } }
public function write() { $username = Session::get('username'); $password = Session::get('password'); if(isset($username) && isset($password)) { if($this->request->isPost()) { $messages = $this->request->post('messages'); if (empty($messages)) { echo "<script>alert('留言不能为空');</script>"; return View::engine('php')->fetch('write'); }else{ $mess = new messages(); return $mess->write($username, $messages); } }else{ return View::engine('php')->fetch('write'); } }else{ echo "<script>alert('你是怎么进来的,hacker?');</script>";; View::engine('php')->fetch('hacker'); } } }
|
再给出模型层
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class messages extends Model { public function show() { $data = Db::table('messages')->select()->order('time', 'desc'); return View::engine('php')->fetch('show', [ 'data' => $data, ]); }
public function write($username, $messages) { $table = Db::table('messages')->where('username', $username)->find(); $data = [ 'username' => $username, 'messages' => $messages ]; Db::name('messages')->insert($data); echo "<script>alert('留言成功');</script>"; return View::engine('php')->fetch('write'); } }
|
剩下自己解决,无非照猫画虎。
注销
删除session即可,不写,自己尝试。
0x04 总结
当那句话出来时,本篇文件就已结束:控制器先写, 模型层再实现,视图层展现,最后配上路由。