祝贺各位成功进入安全开发阶段!网络安全避免不了掌握一些必要的开发知识,为后续代码审计和了解漏洞原理打下基础。这阶段的第一天就让我踩了不少坑,差点找不到开发工具资源放弃了。由于时间紧张,之后笔记会偏向贴出的代码注释加上对逻辑的理解和大概的复现指南。食用建议跟着一起敲代码。
这天的内容要求创建数据库和表,写连接数据库的php脚本,前端表单提交,留言模块前台留言的添加、显示功能和后台留言显示、添加和删除功能。
一.开发前准备
1.开发工具获取
phpstudy可以参考下面贴出的教程。Phpstom小迪给的激活码链接用不了了,可以直接去网店搜相关工具的激活码。navicat用社区版的就可以了,就是要用QQ邮箱来注册一个ID,有两个一样的下载按钮,直接点左边第一个。DW里面放了很多前端的模板,可以在网页直接搜的,比如菜鸟教程。
Phpstudy下载地址:www.xp.cn/phpstudy
Phpstudy配置教程:
blog.csdn.net/wleiloaf/article/details/121662832
Phpstom下载地址:www.jetbrains.com.cn/phpstorm/download/other/#releases-2022
Navicat下载地址:www.navicat.com.cn/download/navicat-premium-lite
2.工具配置
1.Phpstom
解释器选择phpstduy的:
phpStudy_64\phpstudy_pro\phpstudy_pro\Extensions\php\php7.3.4nts\php.exe
点这个可以切换php版本
在小皮的www根目录下创建demo01文件夹,新建项目就选这个
2.Navicat
启动服务并连接本地数据库
启动服务
数据库账号密码
打开navicat,点击左上角连接-->选择MySQL数据库-->填入账号密码就可以连接了
二.代码
1.代码结构:
.htaccess和nginx.htaccess是自己生成的
2.代码
(1)config.php
<?php $dbip='localhost';//数据库IP地址,数据库在本地就是localhost $dbuser='root';//数据库用户名 $dbpass='123456';//数据库密码 $dbname='demo01';//数据库名 $conn=mysqli_connect($dbip,$dbuser,$dbpass,$dbname);//mysqli_connect是php连接MySQL数据库的函数,输入以上四个值就能掉哟个函数连接,把这个连接传给变量$conn,方便给其他数据库操作调用(2)gbook.php
<script src="/ueditor/ueditor.config.js"></script> <script src="/ueditor/ueditor.all.js"></script> //引入UEditor 的 JS 文件 <form id="form1" name="form1" method="post" action=""> 用户名:<input type="text" name="username" maxlength="2000"><br> 内容: <textarea id="content" rows="10" cols="70" name="content" style="border:1px solid #E5E5E5;"> </textarea> <script type="text/javascript"> UE.getEditor("content"); //实例化编辑器传参,id为将要被替换的容器。 </script> <input type="submit" name="submit" id="submit" value="提交"> </form> //写一个前端表单,提交用户名和留言内容。name作为标识和后端的传输,浏览器输入用户名和留言内容提交,后端php分别用username和content接收传输数据。如果用户名改成user,后端就要用user接收。 //id作为前端的标识,输入留言内容的文本框id用content标识.想要给这个文本框引入编辑器就要在文本编辑器引入文本框的id,因为前端不认识什么文本框,只认识id。 //method是提交方法,前端用post方法提交,后端就要用post方法接收。类似地,前端用get方法提交,后端就用get方法接收。其他的都是一些样式,设计这块长宽高、颜色和最大长度等样式。 <?php include 'config.php';//文件包含,因为config.php和gbook.php在同一个目录下面,所以直接填文件名就好了,包含就相当于是导入包,config的变量和函数在这里都可以直接用。 function add_gbook($conn){ //写一个新增留言的函数,传入数据库连接变量。 $u = @$_POST['username']; //因为前端是post方法提交,所以这里用post方法接收,也就是$_POST['name标识'];。前面的@是用来抑制报错的。 if (isset($u)) { //先判断用户名是否为空,不为空则继续执行 $c = @$_POST['content']; $i = @$_SERVER['REMOTE_ADDR']; $ua = @$_SERVER[HTTP_USER_AGENT]; //同样传入留言内容和访问的浏览器IP地址和UA头,后面两个是自动获取的,不用提交 $sql = "insert into gbook(username,content,ipaddr,uagent) value('$u','$c','$i','$ua');"; //写入MySQL插入数据的sql语句,在表gbook中插入用户名、留言内容、IP地址和ua头。表名和列名用‘包起来或者干脆不写,要注意是反单引号。最后有两个分号,第一个是sql语句的,第二个是php的。 if (mysqli_query($conn, $sql)) { //用php的MySQL查询函数传入数据库连接和查询语句,结果不为假则继续往下执行 echo "<script>alert('留言成功!')</script>"; //打印前端弹窗语句<script>alert('留言成功!')</script>到前端,被嵌入前端页面执行,从而弹窗 } } } function show_gbook($conn,$del){ //写显示所有留言的函数,传入数据库连接和删除操作判断变量 $sql1="select * from gbook;"; //查询gbook表中所有数据 $data=mysqli_query($conn,$sql1); //将查询的数据传给变量$data while ($row=mysqli_fetch_row($data)) { //mysqli_fetch_row函数是从查询结果中取出一行数据,用while读取所有数据 echo '<hr>'; //用一条线隔开 echo '用户名:'.$row[0].'<br>'; //.用来连接字符,$row[0]是一行数据中的第一列,也就是用户名<br>用来换行 echo '内容:'.$row[1].'<br>'; echo 'IP地址:'.$row[2].'<br>'; echo 'UA浏览器:'.$row[3].'<br>'; if($del=='del'){ echo "<a href=gbook_admin.php?del=$row[0]>删除</a>"; //如果传入函数的变量为$del是'del',则生成删除那一行数据的链接,点击就会访问http://127.0.0.1/admin/gbook_admin.php?del=用户名,用户名为当前那一行的第一列数据,也就是用户名。 } } } add_gbook($conn); //调用新增留言的函数,在前端提交内容,这个函数就会对内容进行处理 show_gbook($conn,'x'); //调用显示所有留言的函数,del参数为x不等于del,则不生成删除操作的链接(3)gbook_admin.php
<?php include '../config.php'; include '../gbook.php'; show_gbook($conn,'del'); //del参数等于del,则生成删除操作的链接 $delstr=@$_GET['del']; //如果点击了链接就会访问http://127.0.0.1/admin/gbook_admin.php?del=用户名,链接里面有del。因为链接传参是get方式,所以用get方式接收。将传入的用户名传给变量$delstr if(isset($delstr)){ //如果变量不为空则继续往下执行 $sql2="delete from gbook where username = '$delstr';"; //删除表gbook中用户名为$delstr中的数据sql查询语法 if(mysqli_query($conn,$sql2)){ echo "<script>alert('删除成功!')</script>"; } }