PHP安全开发

news2024/11/14 4:12:52

安全开发

请添加图片描述

PHP

基础

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

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

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

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

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

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

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

mysqli_fetch_row() 从结果集中取得一行,并作为枚举数组返回。 mysqli_close() 关闭先前打开的数据库连接。

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

全局变量参考:https://www.w3school.com.cn/php/php_superglobals.asp#google_vignette

$_SERVER[‘PHP_SELF’]返回当前执行脚本的文件名。
$_SERVER[‘GATEWAY_INTERFACE’]返回服务器使用的 CGI 规范的版本。
$_SERVER[‘SERVER_ADDR’]返回当前运行脚本所在的服务器的 IP 地址。
$_SERVER[‘SERVER_NAME’]返回当前运行脚本所在的服务器的主机名(比如 www.w3school.com.cn)。
$_SERVER[‘SERVER_SOFTWARE’]返回服务器标识字符串(比如 Apache/2.2.24)。
$_SERVER[‘SERVER_PROTOCOL’]返回请求页面时通信协议的名称和版本(例如,“HTTP/1.0”)。
$_SERVER[‘REQUEST_METHOD’]返回访问页面使用的请求方法(例如 POST)。
$_SERVER[‘REQUEST_TIME’]返回请求开始时的时间戳(例如 1577687494)。
$_SERVER[‘QUERY_STRING’]返回查询字符串,如果是通过查询字符串访问此页面。
$_SERVER[‘HTTP_ACCEPT’]返回来自当前请求的请求头。
$_SERVER[‘HTTP_ACCEPT_CHARSET’]返回来自当前请求的 Accept_Charset 头( 例如 utf-8,ISO-8859-1)
$_SERVER[‘HTTP_HOST’]返回来自当前请求的 Host 头。
$_SERVER[‘HTTP_REFERER’]返回当前页面的完整 URL(不可靠,因为不是所有用户代理都支持)。
$_SERVER[‘HTTPS’]是否通过安全 HTTP 协议查询脚本。
$_SERVER[‘REMOTE_ADDR’]返回浏览当前页面的用户的 IP 地址。
$_SERVER[‘REMOTE_HOST’]返回浏览当前页面的用户的主机名。
$_SERVER[‘REMOTE_PORT’]返回用户机器上连接到 Web 服务器所使用的端口号。
$_SERVER[‘SCRIPT_FILENAME’]返回当前执行脚本的绝对路径。
$_SERVER[‘SERVER_ADMIN’]该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。
$_SERVER[‘SERVER_PORT’]Web 服务器使用的端口。默认值为 “80”。
$_SERVER[‘SERVER_SIGNATURE’]返回服务器版本和虚拟主机名。
$_SERVER[‘PATH_TRANSLATED’]当前脚本所在文件系统(非文档根目录)的基本路径。
$_SERVER[‘SCRIPT_NAME’]返回当前脚本的路径。
$_SERVER[‘SCRIPT_URI’]返回当前页面的 URI。

身份验证-Cookie 使用

1、客户端向服务器发送 HTTP 请求。

2、服务器检查请求头中是否包含 cookie 信息。

3、如果请求头中包含 cookie 信息,则服务器使用该 cookie 来识别客户端,否则服务 器将生成一个新的 cookie。

4、服务器在响应头中设置 cookie 信息并将其发送回客户端。

5、客户端接收响应并将 cookie 保存在本地。

6、当客户端发送下一次 HTTP 请求时,它会将 cookie 信息附加到请求头中。

7、服务器收到请求并检查 cookie 的有效性。

8、如果 cookie 有效,则服务器响应请求。否则,服务器可能会要求客户端重新登录。

setcookie(): 设置一个 cookie 并发送到客户端浏览器。

unset(): 用于删除指定的 cookie。

身份验证-Session 使用

1、客户端向服务器发送 HTTP 请求。

2、服务器为客户端生成一个唯一的 session ID,并将其存储在服务器端的存储器中 (如文件、数据库等)。

3、服务器将生成的 session ID 作为一个 cookie 发送给客户端。

4、客户端将 session ID 保存为一个 cookie,通常是在本地浏览器中存储。

5、当客户端在发送下一次 HTTP 请求时,它会将该 cookie 信息附加到请求头中,以便 服务器可以通过该 session ID 来识别客户端。

6、服务器使用 session ID 来检索存储在服务器端存储器中的与该客户端相关的 session 数据,从而在客户端和服务器之间共享数据。

session_start(): 启动会话,用于开始或恢复一个已经存在的会话。

$_SESSION: 用于存储和访问当前会话中的所有变量。

session_destroy(): 销毁当前会话中的所有数据。

session_unset(): 释放当前会话中的所有变量。

Session 存储路径:PHP.INI 中 session.save_path 设置路径

唯一性判断-Token 使用

1、生成 Token 并将其存储在 Session

2、生成 Token 并将其绑定在 Cookie 触发

3、尝试登录表单中带入 Token 验证逻辑

示例

gbook.php

<script src="/ueditor/ueditor.config.js">/*引入配置文件*/</script>
<script src="/ueditor/ueditor.all.js">/*引入源码文件*/</script>

<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>

<?php
include 'config.php';


function add_gbook($con){
    $u = @$_POST['username'];
    if (isset($u)) {
        $c = @$_POST['content'];
        $i = @$_SERVER['REMOTE_ADDR'];
        $ua = @$_SERVER['HTTP_USER_AGENT'];
        $sql = "insert into gbook(`username`, `content`,`ipaddr`,`uagent`) value('$u', '$c','$i','$ua');";
        if (mysqli_query($con, $sql)) {
            echo "<script>alert('留言成功!')</script>";
        }
    }
}

function show_gbook($con,$del){
    $sql1="select * from gbook";
    $data=mysqli_query($con,$sql1);
    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');


//if (!$con)
//{
//    die("连接错误: " . mysqli_connect_error());
//}else{
//    $u=@$_POST['username'];
//    if(isset($u)){
//        $c=@$_POST['content'];
//        $i=@$_SERVER['REMOTE_ADDR'];
//        $ua=@$_SERVER['HTTP_USER_AGENT'];
//        $sql="insert into gbook(`username`, `content`,`ipaddr`,`uagent`) value('$u', '$c','$i','$ua');";
//        if(mysqli_query($con,$sql)){
//            echo "<script>alert('留言成功!')</script>";
//            $sql1="select * from gbook";
//            $data=mysqli_query($con,$sql1);
//            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>";
//        }
//
//    }
//
//}


?>

demo01

<?php
$dbip='localhost';
$dbuser='root';
$dbpass='123456';
$dbname='demo01';
$con=mysqli_connect($dbip,$dbuser,$dbpass,$dbname);

gbook-admin.php

<?php
include '../config.php';
include '../gbook.php';

show_gbook($con,'del');


$delstr=@$_GET['del'];
if(isset($delstr)){
    $sql2="delete from gbook where username = '$delstr';";
    if(mysqli_query($con,$sql2)){
        echo "<script>alert('删除成功!')</script>";
    }
}

文件管理模块-上传-过滤机制

$_FILES:PHP 中一个预定义的超全局变量,用于在上传文件时从客户端接收文件,并将其保存到服务器上。它是一个包含上传文件信息的数组,包括文件名、类型、大小、临时文件名等信息。

$_FILES["表单值"]["name"] 获取上传文件原始名称

$_FILES["表单值"]["type"] 获取上传文件 MIME 类型

$_FILES["表单值"]["size"] 获取上传文件字节单位大小

$_FILES["表单值"]["tmp_name"] 获取上传的临时副本文件名

$_FILES["表单值"]["error"] 获取上传时发生的错误代码

move_uploaded_file() 将上传的文件移动到指定位置的函数

is_dir() 函数用于检查指定的路径是否是一个目录

opendir() 函数用于打开指定的目录,返回句柄,用来读取目录中的文件和子目录

readdir() 函数用于从打开的目录句柄中读取目录中的文件和子目录

open_basedir:PHP.INI 中的设置用来控制脚本程序访问目录

文件包含:

include() 在错误发生后脚本继续执行

require() 在错误发生后脚本停止执行

include_once() 如果已经包含,则不再执行

require_once() 如果已经包含,则不再执行

示例

<?php

$name=$_FILES['f']['name'];
$type=$_FILES['f']['type'];
$size=$_FILES['f']['size'];
$tmp_name=$_FILES['f']['tmp_name'];
$error=$_FILES['f']['error'];

//echo $name."<br>";
//echo $type."<br>";
//echo $size."<br>";
//echo $tmp_name."<br>";
//echo $error."<br>";
//if(move_uploaded_file($tmp_name,'upload/'.$name)){
//    echo "文件上传成功!";
//}


//上传文件后缀过滤 黑名单机制
//$black_ext=array('php','asp','jsp','aspx');
xxx.jpg xxx.png
//$fenge = explode('.',$name);
//$exts = end($fenge);
//if(in_array($exts,$black_ext)){
//    echo '非法后缀文件'.$exts;
//}else{
//    move_uploaded_file($tmp_name,'upload/'.$name);
//    echo '<script>alert("上传成功")</script>';
//}

//上传文件后缀过滤 白名单机制
//$allow_ext=array('png','jpg','gif','jpeg');
xxx.jpg xxx.png
//$fenge = explode('.',$name);
//$exts = end($fenge);
//if(!in_array($exts,$allow_ext)){
//    echo '非法后缀文件'.$exts;
//}else{
//    move_uploaded_file($tmp_name,'upload/'.$name);
//    echo '<script>alert("上传成功")</script>';
//}

//MIME文件类型过滤
$allow_type=array('image/png','image/jpg','image/jpeg','image/gif');
if(!in_array($type,$allow_type)){
    echo '非法后缀文件';
}else{
    move_uploaded_file($tmp_name,'upload/'.$name);
    echo '<script>alert("上传成功")</script>';

}
?>

filemange.php

<?php
ini_set('open_basedir',__DIR__);
$path=$_GET['path'] ?? './';
$action = isset($_GET['a'])?$_GET['a']:'';
$path = isset($_GET['path'])?$_GET['path']:'.';
if(is_file($path))
{
    //获得文件名
    $file = basename($path);
    //获得路径
    $path = dirname($path);
}
//判断,不是目录
elseif(!is_dir($path))
{
    echo '我只会吃瓜!';
}
function getlist($path){
    $hd=opendir($path);
    while(($file_name=readdir($hd) )!== false){
        if($file_name != '.' && $file_name != '..'){
            $file_path = "$path/$file_name";
            $file_type = filetype($file_path);
        }
        $list[$file_type][] = array( //$file_type = dir 和 file $list['dir'] 和  $list['file']
            'file_name'=>$file_name, //文件名存储键值file_name
            'file_path'=>$file_path, //文件路径存储键值file_path
            'file_size'=>round(filesize($file_path)/1024), //通过换算文件大小存储键值file_path
            'file_time'=>date('Y/m/d H:i:s',filemtime($file_path)), //获取文件时间并存储键值file_path
        );

    }
    closedir($hd);
    return $list;
}

$list=getlist($path);


//接受方法 判断是怎么操作
//echo $action;
switch ($action){
    case 'del':
        unlink($file);
        //$cmd="del $file";
        //system($cmd);
        //echo $cmd;
        break;
    case 'down':
        header("Content-Type: application/octet-stream");
        header("Content-Disposition: attachment; filename=\"" . $file . "\"");
        header("Content-Length: " . filesize($file));
        readfile($file);
        break;
    case 'edit':
        $content=file_get_contents($file);
        echo '<form name="form1" method="post" action="">';
        echo "文件名:".$file."<br>";
        echo "文件内容:<br>";
        echo '<textarea name="code" style="resize:none;" rows="100" cols="100"">'.$content.'</textarea><br>';
        echo '<input type="submit" name="submit" id="submit" value="提交">';
        echo '</form>';
        break;
}

//检测编辑后提交的事件 进入文件重新写入
if(isset($_POST['code'])){
    $f=fopen("$path/$file",'w+');
    fwrite($f,$_POST['code']);
    fclose($f);
}




?>

<table width="100%" style="font-size: 10px;text-align: center;">
    <tr>
        <th>图标</th>
        <th>名称</th>
        <th>日期</th>
        <th>大小</th>
        <th>路径</th>
        <th>操作</th>
    </tr>
        <?php  foreach ($list['dir'] as $v): ?>
        <tr>
            <td><img src="./img/list.png" width="20" height="20"></td>
            <td><?php echo $v['file_name']?></td>
            <td><?php echo $v['file_time']?></td>
            <td>-</td>
            <td><?php echo $v['file_path']?></td>
            <td><a href="?path=<?php echo $v['file_path']?>">打开</a></td>
        </tr>
        <?php endforeach;?>

        <?php  foreach ($list['file'] as $v): ?>
        <tr>
            <td><img src="./img/file.png" width="20" height="20"></td>
            <td><?php echo $v['file_name']?></td>
            <td><?php echo $v['file_time']?></td>
            <td><?php echo $v['file_size']?></td>
            <td><?php echo $v['file_path']?></td>
            <td>
                <a href="?a=edit&path=<?php echo $v['file_path']?>">编辑</a>
                <a href="?a=down&path=<?php echo $v['file_path']?>">下载</a>
                <a href="?a=del&path=<?php echo $v['file_path']?>">删除</a>
            </td>

        </tr>
        <?php endforeach;?>


</table>

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

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

相关文章

【STM32 Blue Pill编程】-外部中断配置及使用

外部中断配置及使用 文章目录 外部中断配置及使用1、中断介绍2、STM32中的中断3、硬件准备及接线4、GPIO配置5、代码实现在本文中,我们将介绍如何使用 STM32Cube IDE 中的 HAL 库配置和处理外部中断。 我们将通过一个带有按钮和 LED 的示例来演示这一点。 读完本文后,您将能够…

简单了解JVM执行Java程序的基本流程 | 一次编译,到处运行

前言&#xff1a; Java代码怎么做到一次编译&#xff0c;到处运行的呢&#xff1f;靠JVM&#xff0c;那JVM的执行流程是什么呢&#xff1f; 简单来说&#xff1a;通过Javac编译器将Java源代码编译成字节码&#xff0c;JVM通过类加载器将字节码加载到运行时数据区中&#xff0c;…

C++学习笔记之数据结构

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、二叉树1.1 二叉树的遍历1.1.1 深度优先搜索&#xff08;DFS&#xff09;1.1.2 广度优先搜索&#xff08;BFS&#xff09; 1.2 对称性&#xff08;递归法&#x…

【论文笔记】LION: Linear Group RNN for 3D Object Detection in Point Clouds

原文链接&#xff1a;https://arxiv.org/abs/2407.18232 简介&#xff1a;Transformer在3D点云感知任务中有二次复杂度&#xff0c;难以进行长距离关系建模。线性RNN则计算复杂度较低&#xff0c;适合进行长距离关系建模。本文提出基于窗口的网络线性组RNN&#xff08;即对分组…

Android 上下滑隐藏显示状态栏

一、DisplayPolicy类中监听滑动事件&#xff0c;然后发送广播事件 Android12类路径&#xff1a; frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.javamSystemGestures new SystemGesturesPointerEventListener(mUiContext, mHandler,new SystemGest…

《机器学习》周志华-CH1(绪论)

1.1引言 机器学习&#xff08;Matchine-Learning&#xff09;所研究的主要内容是关于在计算机上从数据中产生“模型”&#xff08;model&#xff09;的算法&#xff0c;即“学习算法”&#xff08;learning algorithm&#xff09;。可以说机器学习&#xff08;Matchine-Learni…

2024最新最全面一线大厂面试Tips丨接口测试面试题

面试Tips# 面试是求职过程中至关重要的环节。在如今竞争激烈的就业市场&#xff0c;拥有优秀的面试技巧和良好的面试礼仪显得尤为重要&#xff0c;同样掌握这个的行业面试题也不可或缺。 01 你们公司的接口测试流程 是怎样的&#xff1f; &#xff08;有没有感觉熟悉&#…

[Linux][OS][信号的捕捉] 可重入函数 | volatile | SIGCHLD信号

回顾&#xff1a;[Linux][OS][信号的保存和处理] 信号捕捉 1.sigaction int sigaction(int signo, const struct sigaction *act, struct sigaction *oact); 参数&#xff1a; signo&#xff1a;指定信号的编号act&#xff1a;输入型参数&#xff0c;根据act修改该信号的处…

水果甜度个人手持设备检测-(题外:为啥会选型这个课题)

系列:水果甜度个人手持设备检测 -- 题外&#xff1a;为啥会选型这个课题 写在前面的话 这段时间一直也在思考&#xff0c;在主业之外哪些方向和产业成熟度较高、技术复杂度又不是很离谱&#xff0c;比较容易出成果的方向&#xff0c;能够有空去试着做一做。这几年AI智能化正…

Java方法02:方法的定义和调用

本节内容视频链接&#xff1a;Java方法03&#xff1a;方法的重载_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p47&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 在Java中&#xff0c;‌‌方法的定义是创建一段可重复使用的代码块的过程‌。‌它…

Java 开发者 LLM 实战:利用 LangChain4j 打造高效本地 RAG 系统

1、引言 由于目前比较火的chatGPT是预训练模型&#xff0c;而训练一个大模型是需要较长时间&#xff08;参数越多学习时间越长&#xff0c;保守估计一般是几个月&#xff0c;不差钱的可以多用点GPU缩短这个时间&#xff09;&#xff0c;这就导致了它所学习的知识不会是最新的&…

代码随想录DAY17 - 二叉树 - 08/16

最大二叉树 题干 题目&#xff1a;给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建&#xff1a; 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组…

Linux下载卸载MySql

一. 安装Mysql 1.下载mysql --- 密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm yum -y --enablerepomysql57-community install mysql-community-server 2.启动mysql sy…

如何选择最佳智能排班系统?9款工具全解析

本文介绍的自助排班管理工具有Moka、红圈排班、工作易排班、泛微e-office、Udesk、畅捷通T、Zenefits、Homebase、Deputy。 在管理团队时&#xff0c;手动排班不仅耗时&#xff0c;还容易出错&#xff0c;影响工作效率&#xff0c;相信很多管理者也有同样的困扰。为了解决这个痛…

【Spring Boot】定时任务

目录 前言 定时任务注解Scheduled 设计一个定时任务 1.启用定时任务 2.创建定时任务 Cron 表达式详解 多线程定时任务 总结 定时任务框架xxl-job SpringBoot继承定时任务框架 1.搭建调度中心xxl-job-admin 1.1下载项目 1.2修改配置文件端口和数据库代码 1.3连接到…

Linux进程间通信学习记录(无名管道)

0.Linux进程间通信的方式 &#xff08;1&#xff09;.从UNIX继承过来的通信方式 无名管道&#xff08;pipe&#xff09; 有名管道&#xff08;fifo&#xff09; 信号&#xff08;signal&#xff09; &#xff08;2&#xff09;.System V IPC 共享内存 消息队列 信号灯集 &am…

Java方法03:方法的重载

本节内容视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p47&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p47&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 在Java中&#xff0c;‌方法的重载&#x…

AI编程系列一1小时完成链家房价爬虫程序

背景 AI编程实在太火&#xff0c;写了很多年的Java&#xff0c;现在Python 和Go 简单好用&#xff0c;今天结合智谱清言快速完成一个程序爬虫程序&#xff0c;没有任何Python 编程经验&#xff0c;只需要会提问&#xff0c;熟悉简单HTML结构即可。未来一定是有业务能力者的福…

Anylogic设置颜色

三维对象的颜色修改 以detector智能体为例&#xff0c;颜色修改代码为&#xff1a; detector.setColor(“Material_(4)_Surf”,blue); 二维对象的颜色修改 house智能体为例&#xff0c;对组件内的_ps282填充的颜色进行修改&#xff0c;level_是该智能体已有的参数或者称之为变…

CLRerNet推理详解及部署实现(下)

目录 前言一、CLRerNet推理(Python)1. CLRerNet预测2. CLRerNet预处理3. CLRerNet后处理4. CLRerNet推理 二、CLRerNet推理(C)1. ONNX 导出2. CLRerNet预处理3. CLRerNet后处理4. CLRerNet推理 三、CLRerNet部署1. 源码下载2. 环境配置2.1 配置CMakeLists.txt2.2 配置Makefile …