PHP安全开发

安全开发

请添加图片描述

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.rhkb.cn/news/404216.html

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

相关文章

Java二十三种设计模式-责任链模式(17/23)

责任链模式&#xff1a;实现请求处理的灵活流转 引言 在这篇博客中&#xff0c;我们深入探讨了责任链模式的精髓&#xff0c;从其定义和用途到实现方法&#xff0c;再到使用场景、优缺点、与其他模式的比较&#xff0c;以及最佳实践和替代方案&#xff0c;旨在指导开发者如何…

C++:平衡二叉搜索树之红黑树

一、红黑树的概念 红黑树&#xff0c; 和AVL都是二叉搜索树&#xff0c; 红黑树通过在每个节点上增加一个储存位表示节点的颜色&#xff0c; 可以是RED或者BLACK&#xff0c; 通过任何一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树能够确保没有一条路径会比…

Selenium + Python 自动化测试12(unittest组织更多用例)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 上一篇我们讨论了unittest中test suite 的构建&#xff0c;可以测试多条测试用例。 本篇文章我们接着讲。使用discover()方法构建更多的测试用例。 1、引入需要完成的任务 上…

【网络编程】基于UDP的TFTP文件传输

1&#xff09;tftp协议概述 简单文件传输协议&#xff0c;适用于在网络上进行文件传输的一套标准协议&#xff0c;使用UDP传输 特点&#xff1a; 是应用层协议 基于UDP协议实现 数据传输模式 octet&#xff1a;二进制模式&#xff08;常用&#xff09; mail&#xff1a;已经不再…

Linux进程间通信学习记录(IPC 机制、共享内存以及信号灯集)

0.System V IPC机制&#xff1a; ①.IPC对象包含&#xff1a;共享内存、消息队列和信号灯集。 ②.每个IPC对象有唯一的ID。 ③.IPC对象创建后一直存在&#xff0c;直到被显示地删除。 ④.每一个IPC对象有一个关联的KEY。&#xff08;其他进程通过KEY访问对应的IPC对象&#xff…

Ubuntu安装Anaconda3

本文详细阐述了在 Ubuntu 系统中安装 Anaconda3 的完整流程。包括 Anaconda3 安装包的获取途径&#xff0c;具体安装过程中的每一个步骤及注意事项&#xff0c;还有安装后的环境变量设置和安装成功的验证方法。旨在为 Ubuntu 用户提供清晰、易懂且准确的 Anaconda3 安装指南&am…

Unity--AssetBundle AB包管理器

1.简介 AB包&#xff08;AssetBundle&#xff09;是Unity中用于资源管理的一种机制&#xff0c;它允许开发者将多个文件&#xff08;如纹理、模型、音频等&#xff09;打包成一个单独的文件&#xff0c;以便于在游戏运行时动态加载和卸载。 但是现在出现了最新的Addressable来…

docker部署drawio

1&#xff09;介绍Drawio.io GitHub&#xff1a;GitHub - jgraph/drawio: draw.io is a JavaScript, client-side editor for general diagramming. Draw.io是一款开源的绘制流程图的工具&#xff0c;拥有大量免费素材和模板。程序本身支持中文在内的多国语言&#xff0c;创建…

【学习笔记】多元线性回归模型 —— Matlab

文章目录 前言一、多元线性回归多元线性回归模型线性模型 ( Y , X β , σ 2 I n ) (Y,X\beta,\sigma^2I_n) (Y,Xβ,σ2In​) 考虑的主要问题多元线性回归模型的参数估计多元线性回归模型和回归系数的检验 二、示例三、代码实现----Matlab1.多元回归的实现2.逐步回归的实现3.M…

图像增强技术简介

目录 一、概论 二、图像噪声 三、图像增强处理分类 一、概论 图像增强作为基本的图像处理技术&#xff0c;其目的是对图像进行加工&#xff0c;以得到对具体应用来说视觉效果更“好”更“有用”的图像。图像增强算法并不能增加原始图像的信息&#xff0c;而是通过某种技术手…

MVCC 详解

MVCC 简单理解 MVCC&#xff0c;全称 Multi-Version Concurrency Control&#xff0c;是多版本并发控制的意思。 在高并发情况下操作数据库可能会出现脏写、脏读、不可重复度、幻读这四个问题。通过 MVCC 可以实现在不加锁的前提下避免一些问题。 MVCC 的实现原理 多版本 …

相似度计算方法-编辑距离 (Edit Distance)

定义 编辑距离&#xff08;Edit Distance&#xff09;&#xff0c;也称为Levenshtein距离&#xff0c;是一种衡量两个字符串相似度的方法。它定义为从一个字符串转换为另一个字符串所需的最少单字符编辑操作次数&#xff0c;这些操作包括插入、删除或替换一个字符。 计算方法 …

Openstack二层网络的构建和使用

Openstack二层网络的构建和使用 一、实验目的 &#xff08;1&#xff09;了解网络层级、子网、动态地址、网关代理等概念并进行应用。 &#xff08;2&#xff09;了解OpenStack项目以及相关组件。 &#xff08;3&#xff09;了解 Neutron 二层网络的构建和使用。 二、实验原…

tomcat Listener 内存马浅谈

本文来源无问社区&#xff0c;更多实战内容可前往查看http://www.wwlib.cn/index.php/artread/artid/3651.html Tomcat 介绍 Tomcat的主要功能 toncat作为一个web服务器&#xff0c;实现了两个核心的功能 http 服务器功能&#xff1a;进行socket 通信&#xff08;基于TCP/I…

案例分享—国外深色UI界面设计赏析

在国外&#xff0c;深色界面设计&#xff08;Dark Mode&#xff09;已成为提升用户体验的重要趋势。它不仅有效减少屏幕亮度&#xff0c;保护用户视力&#xff0c;还能在夜晚或低光环境下提供更加舒适的浏览体验。设计师们普遍认识到&#xff0c;深色主题不仅提升了应用的视觉层…

Vue中下载内容为word文档

1.使用 html-docx-js&#xff1a;这是一个将 HTML 转换为 Word 文档的库。 2. 利用 Blob 和 FileSaver.js&#xff1a;创建并下载生成的 Word 文档。 在 Vue.js 中实现步骤如下: 1. npm 安装 html-docx-js 和 file-saver npm install html-docx-js npm install file-saver2.…

【vue教程】六. Vue 的状态管理

目录 往期列表本章涵盖知识点回顾Vuex 的基本概念什么是 Vuex&#xff1f;为什么需要 Vuex&#xff1f; Vuex 的核心概念stategettersmutationsactionsmodules Vuex 的安装和基本使用安装 Vuex创建 store在 Vue 应用中使用 store在组件中访问和修改状态 Vuex 的模块化模块化的好…

2024新型数字政府综合解决方案(七)

新型数字政府综合解决方案通过集成人工智能、大数据、区块链和云计算技术&#xff0c;创建了一个高度智能化和互联互通的政府服务平台&#xff0c;旨在全面提升行政效率、服务质量和透明度。该平台实现了跨部门的数据整合与实时共享&#xff0c;利用人工智能进行智能决策支持和…

PCRNet: Point Cloud Registration Network using PointNet Encoding 论文解读

目录 一、导言 二、先导知识 1、Frobenius范数 三、相关工作 1、点云配准工作 2、PointNet 3、基于深度学习的点云配准 四、PCRNet 1、PCRNet 2、Iterative PCRNet 3、损失函数 五、实验 一、导言 本论文收录于CVPR2019&#xff0c;本论文提出了一种依赖PointNet网…

11.2.0.4 RAC 节点1重做操作系统后如何复原

环境描述&#xff1a;Redhat7.9 11.2.0.4 RAC 双节点 实验背景 群里有大佬在交流RAC中1个节点操作系统坏了如何修复&#xff0c;故有了该实验。 在正常的生产环境当中&#xff0c;有时候会遇到主机磁盘以及其他硬件故障导致主机OS系统无法启动&#xff0c;或者OS系统本身故障…