0x00 前言

安全的基础是开发。本次会详细讲解该项目的过程和心路。

0X01 配置

  1. 本次在windows上安装ThinkPHP8.0稳定版,附上教程:

https://blog.csdn.net/weixin_62797596/article/details/134713455

  1. .example.env修改成.env,文件内容一并修改。

0x02 思路

本项目体量不大,但仍然尝试MVC模型。从控制层入手,具体的业务教给模型层,最后视图层呈现结果。

  • 首先,留言版该实现什么功能呢?

实现注册登录留言注销四个功能。

  • 这些功能该对接哪些控制器呢?

注册,登录,注销都属于用户操作,给UsersController

看留言与写留言属于留言操作,给MessagesController

  • 每一个表对应一个模型,该怎么制作表和模型层?

本项目需要两个表:

users

id username password
1 Pax 123456

messages

id username messages
1 Pax FIag

对应的两个模型层:users.phpmessages.php

对应的视图层文件用到再说。

0x03 实现

登录

步骤

在数据库(mb)里建表users并写入一行数据(如上表所示)。

.env已经拉好配置了,数据库可以连上。

app->controller->users.php文件写入login()方法:
image-20240721102340638

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

image-20240721102632660

这里的$usersmodelusers的实例化

image-20240721102905277

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

image-20240721103319847

最后写入路由:

image-20240721103020287

小结

控制器先写,模型层再实现,视图层展现,最后配上路由。

注册

先写控制层:

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()) {
//XSS
$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']);//要return
}
}else{
return View::engine('php')->fetch('register');
}
}

再写模型层:

php
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');
}

然后是视图层:

image-20240721103855795

配路由按照上面格式即可

留言

给出控制层

php
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);//要return
}
}else{
return View::engine('php')->fetch('write');
}
}else{
echo "<script>alert('你是怎么进来的,hacker?');</script>";;
View::engine('php')->fetch('hacker');
}
}
}

再给出模型层

php
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 总结

当那句话出来时,本篇文件就已结束:控制器先写, 模型层再实现,视图层展现,最后配上路由