ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Day22 XD安全学习笔记-PHP 应用留言板功能超全局变量数据库操作第三方插件引用

Day22 XD安全学习笔记-PHP 应用留言板功能超全局变量数据库操作第三方插件引用 祝贺各位成功进入安全开发阶段网络安全避免不了掌握一些必要的开发知识为后续代码审计和了解漏洞原理打下基础。这阶段的第一天就让我踩了不少坑差点找不到开发工具资源放弃了。由于时间紧张之后笔记会偏向贴出的代码注释加上对逻辑的理解和大概的复现指南。食用建议跟着一起敲代码。这天的内容要求创建数据库和表写连接数据库的php脚本前端表单提交留言模块前台留言的添加、显示功能和后台留言显示、添加和删除功能。一开发前准备1.开发工具获取phpstudy可以参考下面贴出的教程。Phpstom小迪给的激活码链接用不了了可以直接去网店搜相关工具的激活码。navicat用社区版的就可以了就是要用QQ邮箱来注册一个ID有两个一样的下载按钮直接点左边第一个。DW里面放了很多前端的模板可以在网页直接搜的比如菜鸟教程。Phpstudy下载地址:www.xp.cn/phpstudyPhpstudy配置教程blog.csdn.net/wleiloaf/article/details/121662832Phpstom下载地址:www.jetbrains.com.cn/phpstorm/download/other/#releases-2022Navicat下载地址:www.navicat.com.cn/download/navicat-premium-lite2.工具配置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.代码1config.php?php $dbiplocalhost;//数据库IP地址数据库在本地就是localhost $dbuserroot;//数据库用户名 $dbpass123456;//数据库密码 $dbnamedemo01;//数据库名 $connmysqli_connect($dbip,$dbuser,$dbpass,$dbname);//mysqli_connect是php连接MySQL数据库的函数输入以上四个值就能掉哟个函数连接把这个连接传给变量$conn,方便给其他数据库操作调用2gbook.phpscript src/ueditor/ueditor.config.js/script script src/ueditor/ueditor.all.js/script //引入UEditor 的 JS 文件 form idform1 nameform1 methodpost action 用户名input typetext nameusername maxlength2000br 内容 textarea idcontent rows10 cols70 namecontent styleborder:1px solid #E5E5E5; /textarea script typetext/javascript UE.getEditor(content); //实例化编辑器传参,id为将要被替换的容器。 /script input typesubmit namesubmit idsubmit 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 scriptalert(留言成功)/script; //打印前端弹窗语句scriptalert(留言成功)/script到前端被嵌入前端页面执行从而弹窗 } } } function show_gbook($conn,$del){ //写显示所有留言的函数传入数据库连接和删除操作判断变量 $sql1select * from gbook;; //查询gbook表中所有数据 $datamysqli_query($conn,$sql1); //将查询的数据传给变量$data while ($rowmysqli_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($deldel){ echo a hrefgbook_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则不生成删除操作的链接3gbook_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)){ //如果变量不为空则继续往下执行 $sql2delete from gbook where username $delstr;; //删除表gbook中用户名为$delstr中的数据sql查询语法 if(mysqli_query($conn,$sql2)){ echo scriptalert(删除成功!)/script; } }3.交作业1前台页面2前台留言操作3后台页面4后台删除操作5后台留言操作
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进