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

news2024/12/25 23:49:43

第二十二天

在这里插入图片描述

一、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语言中运行

<?php

echo '<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,接收的值为delstr
    if($data = mysqli_query($con,$sql2)){      //执行该结果并将结果存储在data中,并判断一下返回结果
        echo "<script>alert('删除成功!')</script>";     //删除成功的弹窗
}

}

总结

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

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

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

相关文章

【Flutter】One or more plugins require a higher Android SDK version.

问题描述 项目里多个组件需要更高版本的Android SDK One or more plugins require a higher Android SDK version.解决方案&#xff1a; 报错提示requires Android SDK version 34 按提示修改android项目app里build.gradle的compileSdkVersion 为34 android {compileSdkVe…

线程池 ThreadPoolExecutor 参数详解

一、引言 提到 Java 线程池&#xff0c;就不得不说 ThreadPoolExecutor&#xff0c;它是 Java 并发包 java.util.concurrent 中的一个类&#xff0c;提供一个高效、稳定、灵活的线程池实现&#xff0c;用于实现多线程并发执行任务&#xff0c;提高应用程序的执行效率。 在《任…

JVM与GC原理

JVM运行流程 Java 虚拟机&#xff08;Java Virtual Machine&#xff0c;JVM&#xff09;是 Java 平台的核心组件之一&#xff0c;它是一个在实际硬件和操作系统上模拟运行 Java 字节码的虚拟计算机 Java 程序被执行的顺序通常包括以下几个步骤&#xff1a; 编辑&#xff08;E…

Midjourney 中文文档

快速使用 学习如何在Discord上使用Midjourney Bot从简单的文本提示中创建自定义图像。 行为准则 不要表现出不良行为。不要使用我们的工具制作可能引起煽动&#xff0c;不安或引起争议的图像。这包括血腥和成人内容。尊重其他人和团队。 1&#xff1a;加入Discord 访问Midj…

如何让AI生成自己喜欢的歌曲-AI音乐创作的正确方式 - 第507篇

历史文章 AI音乐&#xff0c;8大变现方式——Suno&#xff1a;音乐版的ChatGPT - 第505篇 日赚800&#xff0c;利用淘宝/闲鱼进行AI音乐售卖实操 - 第506篇 导读 在使用AI生成音乐&#xff08;AI写歌&#xff09;的时候&#xff0c;你是不是有这样的困惑&#xff1a; &…

Docker 部署网页版 vscode (code-server)

什么是 code-server code-server 是一个基于 Visual Studio Code 的开源项目&#xff0c;它允许你通过 Web 浏览器来使用 Visual Studio Code 的编辑功能。这意味着你可以在任何设备上&#xff0c;只要有浏览器和网络连接&#xff0c;就可以访问和使用 Visual Studio Code&…

如果备份了oradata文件,该如何还原Oracle数据呢?

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

(mac)性能监控平台搭建JMeter+Grafana+Influxdb

【实现原理】 通过influxdb数据库存储jmeter的结果&#xff0c;再通过grafana采集influxdb数据库数据&#xff0c;完成监控平台展示 一、时间序列数据InfluxDB 1.InfluxDB下载安装 官网下载 https://portal.influxdata.com/downloads/ 官网最新版&#xff1a; &#xff0…

AI预测体彩排列3第2套算法实战化测试第1弹2024年4月22日第1次测试

从今天开始&#xff0c;开始新一轮的测试&#xff0c;本轮测试&#xff0c;以6码为基础&#xff0c;同步测试杀号情况&#xff0c;争取杀至4-5码。经过计算&#xff0c;假如5码命中&#xff0c;即每期125注&#xff0c;投入250元&#xff0c;十期共计2500元&#xff0c;则命中率…

06 JavaScript学习:语句

JavaScript 语句是用来执行特定任务或操作的一组指令。它可以包括变量声明、条件语句、循环语句、函数调用等。JavaScript 语句以分号结尾&#xff0c;每个语句都会被解释器执行。 分号 ; 在JavaScript中&#xff0c;分号&#xff08;;&#xff09;用于表示语句的结束。尽管在…

一款pdf工具

下载链接&#xff1a;点击跳转&#xff1b; 它是一个installer&#xff0c;下好它之后&#xff0c;把网断掉&#xff0c;然后双击它&#xff0c;他会默认安装在C盘&#xff0c;安装时&#xff0c;浏览器可能会有一个弹窗&#xff0c;直接关掉并进入任务管理器杀掉所有smallerp…

漫谈HAMR硬盘的可靠性-1

随着云计算、AI应用、大数据分析等领域对存储需求的持续增长&#xff0c;HAMR技术正逐步引领HDD行业进入新的发展阶段。目前&#xff0c;业内已经有了基于HAMR技术的大容量硬盘&#xff0c;并计划在未来几年内进一步提高至40TB甚至更高容量。 希捷在之前财报中透露&#xff0c;…

C语言结构体,枚举,联合

系列文章目录 第一章 C语言基础知识 第二章 C语言控制语句 第三章 C语言函数详解 第四章 C语言数组详解 第五章 C语言操作符详解 第六章 C语言指针详解 第七章 C语言结构体详解 第八章 详解数据在内存中的存储 第九章 C语言指针进阶 文章目录 1. 结构体 1.1 声明结构…

xhEditor实现WORD粘贴图片自动上传

1.下载示例&#xff1a; 从官网下载 http://www.ncmem.com/webapp/wordpaster/versions.aspx 从gitee中下载 https://gitee.com/xproer/wordpaster-php-xheditor1x 2.将插件目录复制到项目中 3.引入插件文件 定义插件图标 初始化插件&#xff0c;在工具栏中添加插件按钮 效果…

面向对象目录总结

【零】思维导图 【一】初识面向对象 Python 初识面向对象-CSDN博客 【二】面向对象-封装 Python 面向对象之封装和装饰器property_面向对象python封装property-CSDN博客 【三】面向对象-继承 Python 面向对象之继承和组合_面向对象 组合 继承-CSDN博客 【四】面向对象-多…

YOLOv9改进策略 | Conv篇 | 利用 Haar 小波的下采样HWD替换传统下采样(改变YOLO传统的Conv下采样)

一、本文介绍 本文给大家带来的改进机制是Haar 小波的下采样HWD替换传统下采样&#xff08;改变YOLO传统的Conv下采样&#xff09;在小波变换中&#xff0c;Haar小波作为一种基本的小波函数&#xff0c;用于将图像数据分解为多个层次的近似和细节信息&#xff0c;这是一种多分…

6.搭建Eureka

eureka-server自己也是一个微服务&#xff0c;所以eureka-server在启动的时候也会将自己注册到eureka上。eureka集群的时候&#xff0c;会将多个eureka相互注册&#xff0c;这个时候&#xff0c;defaultZone的值会有多个&#xff0c;用逗号隔开。 <?xml version"1.0&…

Mac读写U盘软件哪个好用 Mac读写U盘很慢怎么解决 macbookpro读取u盘

在使用Mac电脑时&#xff0c;读写U盘是一个常见的需求&#xff0c;特别是当U盘格式为NTFS时。选择适合的软件来实现这一操作至关重要。下面我们来看Mac读写U盘软件哪个好用&#xff0c;Mac读写U盘很慢怎么解决的相关内容。 一、Mac读写U盘软件哪个好用 在Mac上选择一款适合的…

程序设计语言—Python几种语言区别的总结

程序设计语言篇—Python&几种语言区别的总结 文章目录 程序设计语言篇—Python&几种语言区别的总结一、Python介绍&理解1.1 Python基础1.2 Python规范 二、标识符&变量&常量三、数据类型&运算符和表达式3.1 数据类型3.2 运算符&表达式 四、常用的函…

HarmonyOS ArkUI实战开发-NAPI数据类型

在前两篇文章里笔者简单介绍了 NAPI 工程结构以及生成的 cpp 源码部分&#xff0c;其中 JS 应用层传递过来的数据被封装在了 napi_value 中&#xff0c;使用前先要转换成对应的 C/C 数据类型&#xff0c;C/C 端的数据也要转换成 napi_value 数据类型传递给 JS 应用层&#xff0…