第22天:安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用

第二十二天

在这里插入图片描述

一、PHP留言板前后端功能实现

开发环境:

DW + PHPStorm + PhpStudy + Navicat Premium

DW : HTML&JS&CSS开发

PHPStorm : 专业PHP开发IDE

PhpStudy :Apache MYSQL环境

Navicat Premium: 全能数据库管理工具


二、数据库创建&架构&增删改查

1、数据库名,数据库表名,数据库列名

2、数据库数据,格式类型,长度,键等

1.PHP函数:连接,选择,执行,结果,关闭等

参考:https://www.runoob.com/php/php-ref-mysqli.html

常用:

mysqli_connect() 打开一个到MySQL的新的连接。

mysqli_select_db() 更改连接的默认数据库。

mysqli_query() 执行某个针对数据库的查询。

mysqli_fetch_row() 从结果集中取得一行,并作为枚举数组返回。

mysqli_close() 关闭先前打开的数据库连接。


2.MYSQL增删改查:

查:select * from 表名 where 列名=‘条件’;

增:insert into 表名(列名1, 列名2) value(‘列1值1’, ‘列2值2’);

删:delete from 表名 where 列名 = ‘条件’;

改:update 表名 set 列名 = 数据 where 列名 = ‘条件’;

三、内置超全局变量&HTML&JS混编

1、html混编:使HTML(JS)在PHP语言中运行

<?phpecho '<script>alert('x');</script>'?>

2、超全局变量:

参考:

https://www.w3school.com.cn/php/php_superglobals.asp

https://www.php.net/manual/zh/language.variables.superglobals.php

$GLOBALS:这种全局变量用于在 PHP 脚本中的任意位置访问全局变量

$_SERVER:这种超全局变量保存关于报头、路径和脚本位置的信息。

R E Q U E S T : _REQUEST: REQUEST_REQUEST 用于收集 HTML 表单提交的数据。

$_POST:广泛用于收集提交method=“post” 的HTML表单后的表单数据。

$_GET:收集URL中的发送的数据。也可用于收集提交HTML表单数据(method=“get”) $_FILES:文件上传且处理包含通过HTTP POST方法上传给当前脚本的文件内容。

$_ENV:是一个包含服务器端环境变量的数组。

$_COOKIE:是一个关联数组,包含通过cookie传递给当前脚本的内容。

$_SESSION:是一个关联数组,包含当前脚本中的所有session内容。


四、第三方应用插件&传参&对象调用

引用:<script src='../xxx.js'></script>
函数对象调用:
var obj = {value : 0,increment : function (inc) {   this.value += typeof inc === 'number' ? inc :1;//设置inc且为数字时 value=inc 反之 value=1}
}
obj.increment();
console.log(obj.value);  //1
obj.increment(2);
console.log(obj.value);  //2

五、环境复现

1.数据导入-mysql架构&库表列

1.打开PHPStudy打开Apache服务器和MySQL数据库服务

image-20240401171021909

2.打开Navicat创建新数据库并命名,字符集为utf8,排序规则为utf8_bin

image-20240401174257650

3.新建表并新建字段名为username、类型为varchar、勾选不能为空;继续新建content、ipaddr、uagent三个字段

image-20240401174501480

4.保存数据表名为gbook

image-20240401174513662

5.打开PHPStorm,创建新项目和新的PHP文件

image-20240401174634880

6.可以点击右边的预览按钮来查看浏览器运行的效果

image-20240401174734365

7.发现提示没有配置CLI解释器,去小皮面板安装的位置查找

image-20240401152432779

image-20240401152339637

image-20240401152502875

8.输入一段命令,发现正常显示即可

image-20240401152730504

9.编写界面显示代码

image-20240401180014857

<form id="form1" name="form1" method="post" action="">  //action代表发送目标,留空就是自己;post就是提交数据<p>用户名:<input type="text" name="username">     //给name值,这是一个传参值,假如输入123,那用户名就为123</p><p>内容:    </p><p><textarea name="content"></textarea>        //content也是传参值</p><input type="submit" name="sumbit" id="sumbit" value="提交"></form>
10.写完之后进入浏览器输入内容查看效果

image-20240401163851150

11.查看数据库连接情况

image-20240401174838003


2.数据库操作-mysqli函数&增删改查

1.根据数据库中的表建立SQL语句

image-20240401181724182

2.增删改查的代码
<?php
//数据库通信
$dbip = 'localhost';
$dbuser = 'root';
$dbpass = 'root';
$dbname = 'dome01';   //固定这四个地址//使用该函数来与数据库建立连接
$con = mysqli_connect($dbip,$dbuser,$dbpass,$dbname);//判断是否连接成功
if(!$con){die("连接错误:" .mysqli_connect_error());      //如果错误就提示,正确不提示
}else{$u=@$_POST['username'];  //接收表单username的值,@符号为容错符号,防止没有数据浏览器进行报错提示if(isset($u)){      //如果接收到值的话$c = @$_POST['content'];   //POST是第一行的全局变量,是PHP接收数据用的,如果是GET那就改成GET$i = @$_SERVER['REMOTE_ADDR'];    //获取IP地址$ua = @$_SERVER['HTTP_USER_AGENT'];   //获取浏览器版本信息$sql = "insert into gbook(`username`, `content`,`ipaddr`,`uagent`) values ('$u','$c','$i','$ua');";  //构建SQL数据库语句,使用双引号识别变量//vlue函数里接收的是下面函数的变量,使用单引号括起来,因为接收的值可能是非数值型if(mysqli_query($con,$sql)){    //数据库执行语句,加一个if判断语句echo "<script>alert('留言成功!');</script>";    //因为是JS语句,在JS代码中不行,所以直接输出//查询并显示留言列表$sql1 = "select * from gbook";    //查询数据库所有数据$data = mysqli_query($con,$sql1);    //执行该结果并将结果存储在data中while ($row = mysqli_fetch_row($data)) {echo '<hr>';echo '用户名:' . $row[0] . '<br>';echo '内容:' . $row[1] . '<br>';echo 'IP地址:' . $row[2] . '<br>';echo 'UA浏览器:' . $row[3] . '<br>';}}else{echo "<script>alert('留言失败!');</script>";}}else{echo "<script>alert('用户名不能为空!')</script>";  //用户名为空的情况}
}
?>
3.查看执行结果和数据库后台数据

image-20240401222103825

image-20240401222120674


3.数据接收输出-html混编&超全局变量

1.新建后台目录和后台文件,专门用于管理留言

image-20240401222513673

2.由于管理留言麻烦,所以定义一个全局配置文件去连接数据库

image-20240401222915919

3.在gbook文件里调用config文件

image-20240402012402616

4.在gbook-admin文件里掉用上级目录config文件

image-20240402012453285

5.查看显示效果,不输入参数都能直接看到数据

image-20240402012515267

6.编写删除功能,查看删除效果
<?php
include '../config.php';   //包含文件$sql1 = "select * from gbook";    //查询数据库所有数据
$data = mysqli_query($con,$sql1);    //执行该结果并将结果存储在data中
while ($row = mysqli_fetch_row($data)) {echo '<hr>';echo '用户名:' . $row[0] . '<br>';echo '内容:' . $row[1] . '<br>';echo 'IP地址:' . $row[2] . '<br>';echo 'UA浏览器:' . $row[3] . '<br>';echo "<a href = 'gbook-admin.php?del = $row[0]'>删除</a> ";   //输出一个删除按钮,href写的是当前文件名,del是删除对象,值为用户名}$delstr = $_GET['del'];     //接收del的值,参数名位del
$sql2 = "delete from gbook where username = '$delstr';";//接收完之后要重新组织SQL语句//条件是表名为gbook,因为接收的是用户名,所以接收的列名是username,接收的值为delstr
if($data = mysqli_query($con,$sql2));{      //执行该结果并将结果存储在data中,并判断一下返回结果echo "<script>alert('删除成功!')</script>";
}

image-20240402015319024

image-20240402015712725

7.编写留言成功显示功能,查看效果
//24-39行就是为了添加留言的功能
function add_gbook($con)
{$u = @$_POST['username'];  //接收表单username的值,@符号为容错符号,防止没有数据浏览器进行报错提示if (isset($u)) {      //如果接收到值的话$c = @$_POST['content'];   //POST是第一行的全局变量,是PHP接收数据用的,如果是GET那就改成GET$i = @$_SERVER['REMOTE_ADDR'];    //获取IP地址$ua = @$_SERVER['HTTP_USER_AGENT'];   //获取浏览器版本信息$sql = "insert into gbook(`username`, `content`,`ipaddr`,`uagent`) values ('$u','$c','$i','$ua');";  //构建SQL数据库语句,使用双引号识别变量//vlue函数里接收的是下面函数的变量,使用单引号括起来,因为接收的值可能是非数值型if (mysqli_query($con, $sql)) {    //数据库执行语句,加一个if判断语句echo "<script>alert('留言成功!');</script>";    //因为是JS语句,在JS代码中不行,所以直接输出}}
}//42-55行就是为了显示留言数据的
function show_gbook($con){$sql1 = "select * from gbook";    //查询数据库所有数据$data = mysqli_query($con,$sql1);    //执行该结果并将结果存储在data中while ($row = mysqli_fetch_row($data)){echo '<hr>';echo '用户名:' . $row[0] . '<br>';echo '内容:' . $row[1] . '<br>';echo 'IP地址:' . $row[2] . '<br>';echo 'UA浏览器:' . $row[3] . '<br>';}
}add_gbook($con);
show_gbook($con);

image-20240402021734700

8.精简代码逻辑,在gbook-admin中调用,测试前端页面无删除按钮,admin页面有删除按钮

image-20240402023910212

image-20240402023957836

image-20240402024206156

image-20240402024443229


4.第三方插件引用-js传参&函数对象调用

1.在demo01文件夹下创建ueditor文件夹,将ueditor文件放进去实现评论区图片的功能

image-20240402113326474

2.编写编辑器实例化传参

image-20240402114427532

3.去小皮面板建立站点,将路径指向源代码的位置,再打开网站

image-20240402115022576

image-20240402200826552


最后的代码

gbook.php

//调用ueditor
<script src="/ueditor/ueditor.config.js">/*引入配置文件*/</script>
<script src="/ueditor/ueditor.all.js">/*引入源码文件*/</script><!-- 9-24行都是前端显示界面 --><form id="form1" name="form1" method="post" action=""><!-- action代表发送目标,留空就是自己;post就是提交数据 -->用户名:<input type="text" name="username"><br><!-- 给name值,这是一个传参值,假如输入123,那用户名就为123 -->内容:<textarea id="content" rows="10" cols="70" name="content" style="..."></textarea><script type="text/javascript">UE.getEditor("content");//实例化编辑器传参,ID为讲要被替换的容器</script><input type="submit" name="sumbit" id="sumbit" value="提交"></form><?php
include 'config.php';   //与config.php共享代码//30-45行就是为了添加留言的功能
function add_gbook($con)
{$u = @$_POST['username'];  //接收表单username的值,@符号为容错符号,防止没有数据浏览器进行报错提示if (isset($u)) {      //如果接收到值的话$c = @$_POST['content'];   //POST是第一行的全局变量,是PHP接收数据用的,如果是GET那就改成GET$i = @$_SERVER['REMOTE_ADDR'];    //获取IP地址$ua = @$_SERVER['HTTP_USER_AGENT'];   //获取浏览器版本信息$sql = "insert into gbook(`username`, `content`,`ipaddr`,`uagent`) values ('$u','$c','$i','$ua');";  //构建SQL数据库语句,使用双引号识别变量//vlue函数里接收的是下面函数的变量,使用单引号括起来,因为接收的值可能是非数值型if (mysqli_query($con, $sql)) {    //数据库执行语句,加一个if判断语句echo "<script>alert('留言成功!');</script>";    //因为是JS语句,在JS代码中不行,所以直接输出}}
}//48-61行就是为了显示留言数据的
function show_gbook($con,$del){     //设置参数$sql1 = "select * from gbook";    //查询数据库所有数据$data = mysqli_query($con,$sql1);    //执行该结果并将结果存储在data中while ($row = mysqli_fetch_row($data)){echo '<hr>';echo '用户名:' . $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>";   //输出这个值}}
}add_gbook($con);
show_gbook($con,'x');   //赋值一个错误值就不显示删除,由于52行没有输出x,所以不会显示删除按钮//判断是否连接成功
if(!$con){die("连接错误:" .mysqli_connect_error());      //如果错误就提示,正确不提示
}else{$u=@$_POST['username'];  //接收表单username的值,@符号为容错符号,防止没有数据浏览器进行报错提示if(isset($u)){      //如果接收到值的话$c = @$_POST['content'];   //POST是第一行的全局变量,是PHP接收数据用的,如果是GET那就改成GET$i = @$_SERVER['REMOTE_ADDR'];    //获取IP地址$ua = @$_SERVER['HTTP_USER_AGENT'];   //获取浏览器版本信息$sql = "insert into gbook(`username`, `content`,`ipaddr`,`uagent`) values ('$u','$c','$i','$ua');";  //构建SQL数据库语句,使用双引号识别变量//vlue函数里接收的是下面函数的变量,使用单引号括起来,因为接收的值可能是非数值型if(mysqli_query($con,$sql)){    //数据库执行语句,加一个if判断语句echo "<script>alert('留言成功!');</script>";    //因为是JS语句,在JS代码中不行,所以直接输出//查询并显示留言列表$sql1 = "select * from gbook";    //查询数据库所有数据$data = mysqli_query($con,$sql1);    //执行该结果并将结果存储在data中while ($row = mysqli_fetch_row($data)) {echo '<hr>';echo '用户名:' . $row[0] . '<br>';echo '内容:' . $row[1] . '<br>';echo 'IP地址:' . $row[2] . '<br>';echo 'UA浏览器:' . $row[3] . '<br>';}}else{echo "<script>alert('留言失败!');</script>";}}else{echo "<script>alert('用户名不能为空!')</script>";  //用户名为空的情况}
}
?>

config.php

<?php
//数据库通信
$dbip = 'localhost';
$dbuser = 'root';
$dbpass = 'root';
$dbname = 'dome01';   //固定这四个地址//使用该函数来与数据库建立连接
$con = mysqli_connect($dbip,$dbuser,$dbpass,$dbname);
?>

gbook-admin.php

<?php
include '../config.php';   //包含文件
include '../gbook.php';     //调用该文件show_gbook($con,'del');   //显示gbook文件内容中$con值,显示删除按钮$delstr = $_GET['del'];     //接收del的值,参数名位del
if(isset($delstr)){     //判断有值进入的时候再进行操作,否则不处理$sql2 = "delete from gbook where username = '$delstr';";//接收完之后要重新组织SQL语句//条件是表名为gbook,因为接收的是用户名,所以接收的列名是username,接收的值为delstrif($data = mysqli_query($con,$sql2)){      //执行该结果并将结果存储在data中,并判断一下返回结果echo "<script>alert('删除成功!')</script>";     //删除成功的弹窗
}}

总结

  1. 在代码中的编辑器是引用别人的,如果这个编辑器存在上传漏洞那自己无法得知,问题就是第三方框架安全的例子。
  2. 前面写的admin文件,如果别人访问就能直接访问到,就可以删除留言,原因就是没有做用户权限判定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/1800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习(三)之监督学习2

前言&#xff1a; 本专栏一直在更新机器学习的内容&#xff0c;欢迎点赞收藏哦&#xff01; 笔者水平有限&#xff0c;文中掺杂着自己的理解和感悟&#xff0c;如果有错误之处还请指出&#xff0c;可以在评论区一起探讨&#xff01; 1.支持向量机&#xff08;Support Vector Ma…

iTwin Capture Modeler-23中文版下载地址及安装教程

文章目录 一、iTwin Capture Modeler23中文版安装教程二、iTwin Capture Modeler23中文版下载地址一、iTwin Capture Modeler23中文版安装教程 1. 解压安装包。订阅专栏(可获取专栏内所有文章阅读权限与软件安装包)后,从文末获取安装包解压,如下所示: 2. 右击安装包,选择以…

【Web】HNCTF 2022 题解(全)

目录 Week1 Interesting_include 2048 easy_html What is Web Interesting_http easy_upload Week2 ez_SSTI easy_include ez_ssrf Canyource easy_unser easy_sql ohmywordpress Week3 ssssti Fun_php ez_phar QAQ_1inclu4e logjjjjlogjjjj …

图像哈希:Global+Local

文章信息 作者&#xff1a;梁小平&#xff0c;唐振军期刊&#xff1a;ACM Trans. Multimedia Comput. Commun. Appl&#xff08;三区&#xff09;题目&#xff1a;Robust Hashing via Global and Local Invariant Features for Image Copy Detection 目的、实验步骤及结论 目…

内网隧道技术总结

隧道技术解决的是网络通信问题&#xff0c;因为在内网环境下&#xff0c;我们不同的内网主机管理员会进行不同的网络配置&#xff0c;我们就需要使用不同的方式去控制我们的内网主机。隧道技术是一个后渗透的过程&#xff0c;是可以是我们已经取得了一定的权限&#xff0c;在这…

NLP任务全览:涵盖各类NLP自然语言处理任务及其面临的挑战

自然语言处理(Natural Language Processing, 简称NLP&#xff09;是计算机科学与语言学中关注于计算机与人类语言间转换的领域。NLP将非结构化文本数据转换为有意义的见解&#xff0c;促进人与机器之间的无缝通信&#xff0c;使计算机能够理解、解释和生成人类语言。人类等主要…

(四)openlayers加入矢量图层.json文件

openlayers加入矢量图层.json文件 &#xff08;1&#xff09;接上一章节&#xff0c;添加矢量图层.json文件。首先下载.json矢量图层文件。链接&#xff1a;JSON矢量图层文件 &#xff08;2&#xff09;导入相关的依赖&#xff0c;提前把你下载好的矢量文件放入assets文件夹下…

巧用波卡生态优势,Mythical Games 引领 Web3 游戏新航向

Polkadot 对创新、安全和治理的承诺为 Mythical Games 提供了极大的发展价值。这个链上生态不仅将支持 Mythical Games 成长发展&#xff0c;还将帮助其他 Mythos 合作伙伴来壮大建设项目。 —— Mythical Games 创始人兼首席执行官 John Linden 近期 Web3 游戏行业又有新动向&…

microk8s拉取pause镜像卡住

前几天嫌服务器上镜像太多占空间&#xff0c;全部删掉了&#xff0c;今天看到 microk8s 更新了 1.30 版本&#xff0c;果断更新&#xff0c;结果集群跑不起来了。 先通过 microk8s.kubectl get pods --all-namespaces 命令看看 pod 状态。 如上图可以看到&#xff0c;所有的业…

JS -关于对象相关介绍

在JS中&#xff0c;除去基本的数据类型&#xff0c;还有包含对象这种复合数据类型&#xff0c;他可以储存多个键值对&#xff0c;并且每个键都是唯一的&#xff0c;并且在对象中可以包含各种数据类型的值&#xff0c;包括其他对象&#xff0c;数组&#xff0c;函数等。对象是Ja…

LeetCode in Python 72. Edit Distance (编辑距离)

编辑距离的基本思想很直观&#xff0c;即不断比较两个单词每个位置的元素&#xff0c;若相同则比较下一个&#xff0c;若不同则需要考虑从插入、删除、替换三种方法中选择一个最优的策略。涉及最优策略笔者最先想到的即是动态规划的思想&#xff0c;将两个单词的位置对应放在矩…

Vue2 移动端(H5)项目封装弹窗组件

前言 因vant-ui的dialog组件没有自定义footer插槽 效果 参数配置 1、代码示例&#xff1a; <t-dialog :visible.sync"show" :title"title" submit"submit"></t-dialog>2、配置参数&#xff08;t-dialog Attributes&#xff09; 参…

IS62C256AL-45TLI功能参数介绍及如何优化性能

IS62C256AL-45TLI功能和参数介绍及如何优化性能-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 产品品种:静态随机存取存储器 RoHS:是 存储容量:256 kbit 组织:32 k x 8 访问时刻:45 ns 接口类型:Parallel 电源电压-最大:5.5 V 电源电压-最小:4.5 V 电源电流—最大值:25 mA 最小…

JumpServer搭建堡垒机实战

文章目录 第一步、下载安装第二步、访问异常处理【1】docker方式拉取失败 JumpServer是运维人员可连接内部服务器上进行操作&#xff0c;支持Linux等操作系统的管理工具。 第一步、下载安装 curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver/releases/latest/…

OpenCV-复数矩阵点乘ComplexMatrixDotMultiplication

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 需求说明 一般用到FFT&#xff0c;就涉及到复数的计算&#xff0c;为了便于调用&#xff0c;我自行封装了一个简单的复数矩阵点乘…

如何用网页绘制一个黑莓9900的键盘效果图

如何用网页绘制一个黑莓9900的键盘效果图 入了几个黑莓蓝牙键盘&#xff0c;出于喜好&#xff0c;想做一个跟实体键盘一模一样的网页界面。 最终的实现效果是这样的&#xff1a; 在线查看&#xff1a;http://kylebing.cn/tools/bb-keyboard 点击上面四个按键显示不同模型界面…

Linux 网络操作命令Telnet

Telnet 尽管 Telnet 已经逐渐被更安全的 SSH 协议所取代&#xff0c;但在某些特定场景下&#xff0c;如对旧系统的维护或教育目的&#xff0c;Telnet 仍然有其使用价值。本文将介绍如何在 Linux 系统中安装 Telnet 客户端&#xff0c;以及如何使用它进行远程登录。 用户使用 t…

Activiti——将绘制的流程图存入act数据库并进行流程推进与状态流转

文章目录 前言流程图入库操作 RepositoryService项目结构数据库连接配置文件入库Java测试代码zip 方式进行流程的批量部署 流程启动 RuntimeService待处理任务查看 TaskService流程状态的扭转查询流程定义信息 RepositoryService查询正在执行的流程实例 RuntimeService已部署流…

Springboot+Vue项目-基于Java+MySQL的在线文档管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

实测14us,Linux-RT实时性能及开发案例分享—基于全志T507-H国产平台

本文带来的是基于全志T507-H&#xff08;硬件平台&#xff1a;创龙科技TLT507-EVM评估板&#xff09;&#xff0c;Linux-RT内核的硬件GPIO输入和输出实时性测试及应用开发案例的分享。本次演示的开发环境如下&#xff1a; Windows开发环境&#xff1a;Windows 7 64bit、Window…