web安全学习笔记(8)

记一下第十二节课的内容。

一、PHP文件包含的四种方式

Include和Include_once

        操作系统会读取包含的文件的内容,并将它插入主文件中,include方式的文件包含会在包含失败的情况下输出警告信息,而include_once方式会检查包含的文件是否已经被包含过,如果已经包含过则不再重新包含。

Require和Require_once

        require和require_once方式的文件包含和include与include_once是类似的,不过它们之间的不同点在于把汗出错时,require方式会直接导致程序终止并输出错误信息,而include方式只是警告信息。require_once方式会检查包含的文件是否以及被包含过,如果已经包含过则不再重新包含。这一点和include_once方式是一样的。

进行一下示例:

将login.php改为如下内容:

<?php
    include('./function.php')

    /*
    #用户名
    $username = $_POST['username'];
    #密码
    $password = $_POST['password'];
    
    #判断用户名与密码不正确则输出失败
    if ($username != 'admin' || $password != '123456') {
        die('<script>alert("登录失败!");location.href = "./login.html"</script>'); 
    } 
    echo '登录成功!';
    */
?>

function.php文件中输入如下内容:

<?php
echo 111;

我们再进行登录,就echo出来了111

思考:如果多次使用include和include_once,以及require和require_once,当文件名正确或者错误时,会出现什么情况?

那么我们把login.php改名为index.php(黑鬼改的,我也不知道为啥改名,跟着改吧)

然后将其中代码改为:

<?php
    $a = $_GET['a'];
    $b = $_GET['b'];

    switch ($a) {
        case 'login':
            switch ($b) {
                case 'index':
                    require_once('./login.html'); -
                break;
                
                default:
                    # code...
                break;
            }
        break;
        
        default:
            # code...
        break;
    }
?>

当我们在login.html中,点击登录之后,就会出现空白页面,因为这段switch代码并没有有效执行

可以看到,跳转之后是空白页面。

那么我们如何让这段代码执行呢?通过更改我们的网址,在后面加上如下内容,就会让require_once得到执行。

然后我们将login.php改为如下内容:

<?php
    $a = $_GET['a'];
    $b = $_GET['b'];
    $f = $_SERVER['REQUEST_METHOD'];

    switch ($a){
        case 'login':
            switch ($b){
                case 'index':
                    switch ($f) {
                        case 'GET':
                            require_once('./login.html');
                        break;

                        case 'POST':
                            echo 111;
                        break;
                        
                        default:
                            # code...
                            break;
                    }
                break;
                
                default:
                    # code...
                break;
            }
        break;
        
        default:
            # code...
        break;
    }
?>

再进行访问,会发现还会回跳到login.html的页面:

原因是我们多了一层switch嵌套之后,实际上相当于多判断一次传参方式是否是get传参,而此处显然是,所以可以正常显示。另外,$_SERVER 是PHP预定义的超全局变量。所谓“超全局变量”,即在脚本全部作用域中都可以使用,$_SERVER保存关于报头、路径和脚本位置的信息。

主要内容详解

  • $_SERVER["SCRIPT_NAME"] => "/index.php",当前脚本路径
  • $_SERVER["REQUEST_URI"] => "/index.php?id=1",访问的页面URI,包含查询字符串
  • $_SERVER["QUERY_STRING"] => "id=1",查询字符串,不存在为" "
  • $_SERVER["REQUEST_METHOD"] => "GET",请求方法,如"POST"、"PUT"等
  • $_SERVER["SERVER_PROTOCOL"] => "HTTP/1.1",通信协议的名称和版本
  • $_SERVER["GATEWAY_INTERFACE"] => "CGI/1.1",服务器使用的CGI 规范的版本
  • $_SERVER["REMOTE_PORT"] => "60599",用户连接服务器使用的端口
  • $_SERVER["SCRIPT_FILENAME"] => "E:/WWW/example/index.php",当前脚本的绝对路径
  • $_SERVER["DOCUMENT_ROOT"] => "E:/WWW/example/",当前脚本文档根目录的绝对路径
  • $_SERVER["REMOTE_ADDR"] => "127.0.0.1",用户的IP地址
  • $_SERVER["SERVER_PORT"] => "80",服务器使用的端口
  • $_SERVER["SERVER_ADDR"] => "127.0.0.1",服务器的IP地址
  • $_SERVER["SERVER_NAME"] => "www.example.com",服务器的主机名,注:如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定。在 Apache 2 里,必须设置 UseCanonicalName = On 和 ServerName。 否则该值会由客户端提供,就有可能被伪造。 上下文有安全性要求的环境里,不应该依赖此值。
  • $_SERVER["SERVER_SOFTWARE"] => "Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9",响应头中Server的内容
  • $_SERVER["SERVER_SIGNATURE"] => "",包含了服务器版本和虚拟主机名的字符串
  • $_SERVER["HTTP_HOST"] => "www.example.com",请求头中Host项的内容
  • $_SERVER["HTTP_CONNECTION"] => "keep-alive",请求头中Connection项的内容
  • $_SERVER["HTTP_PRAGMA"] => "no-cache",请求头中Pragma项的内容
  • $_SERVER["HTTP_CACHE_CONTROL"] => "no-cache",请求头中Cache-Control项的内容
  • $_SERVER["HTTP_UPGRADE_INSECURE_REQUESTS"] => "1",请求头中Upgrade-Insecure-Requests项的内容
  • $_SERVER["HTTP_USER_AGENT"] => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",请求头中User-Agent项的内容
  • $_SERVER["HTTP_ACCEPT"] => "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8",请求头中Accept项的内容
  • $_SERVER["HTTP_ACCEPT_ENCODING"] => "gzip, deflate",请求头中Accept-Encoding项的内容
  • $_SERVER["HTTP_ACCEPT_LANGUAGE"] => "zh-CN,zh;q=0.8",请求头中Accept-Language项的内容
  • $_SERVER["PHP_SELF"] => "/index.php",当前执行脚本的文件名
  • $_SERVER["REQUEST_TIME_FLOAT"] => 1510112348.8084,请求开始的时间戳,微秒级别精准度
  • $_SERVER["REQUEST_TIME"] => 1510112348,请求开始的时间戳

此处用到的就是$_SERVER["REQUEST_METHOD"] ,表示请求方法,如"POST"、"PUT"等。

引用自PHP 的 $_SERVER详解-CSDN博客

二、PHP的数据类型——数组和字典

1.数组

 1.1一维数组

用一个实例说明数组的定义和访问:

<?php
$array = [
    0 => 'a',
    1 => 'b',
    2 => 'c',
    3 => 'd'
];

echo $array[1];

通过网页访问:

或者通过下面方式声明:

<?php
$array = ['1','2','3','4','5'];
echo $array[4];

下面我们来看一下键值数组:

<?php
$array = [
    'name' => 'zhangsan',
    'age' => 30,
];


echo $array['age'];

1.2二维数组

定义一个二维数组,并使用var_dump函数查看其数据类型:

<?php
$array = [[1,2,3,4,5,6],[1,2,3,4,5,6]];
var_dump($array);

不难发现,实际上,二维数组就是数组的嵌套使用。类似地,还有三维数组、四维数组……

要取二维数组的某个元素,使用$array[i][j]即可,i指的是第i个数组,j指的是第i个数组中的第j个元素。注意:数字占一个字节,而中文占三个字节。

1.3键值数组

不多bb,上代码:

<?php
$array = [
    [
        'name' => '张三'
    ],[
        'name' => '99'
    ],[
        'name' => '丁真',
        'smile' => '纯真',
        'animalfriend' => '雪豹',
    ]
];
echo $array[2]['animalfriend'], '闭嘴';

2.字典

没讲,应该是下节课讲。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS3新增

一些CSS3新增的功能 课程视频链接 目录 CSS3概述私有前缀长度单位remvwvhvmaxvmin 颜色设置方式ragbhslhsla 选择器动态伪类目标伪类语言伪类UI伪类结构伪类否定伪类伪元素 盒子属性box-sizing问题插播 宽度与设置的不同 resizebox-shadowopacity 背景属性background-originb…

状态模式(行为型)

目录 一、前言 二、状态模式 三、总结 一、前言 状态模式(State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类&#xff0c;但实际上&#xff0c;由于状态模式的引入&#xff0c;行为的变…

视频插针调研

视频插针 1、评估指标2、准确度3、实时4、视频流处理3、实时RIFE视频插帧测试 1、评估指标 参考&#xff1a;https://blog.csdn.net/weixin_43478836/article/details/104159648 https://blog.csdn.net/weixin_43605641/article/details/118088814 PSNR和SSIM PSNR数值越大表…

力扣121. 买卖股票的最佳时机

Problem: 121. 买卖股票的最佳时机 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义一个int数组max大小同prices&#xff1b;定义int变量curMax初始化为0&#xff1b; 2.从后往前遍历数组&#xff0c;若当前元素prices[i] > curMax时&#xff0c;则使将其赋值给curMa…

聊一聊一些关于npm、pnpm、yarn的事

前言 整理了最近的闲聊&#xff0c;话题是前端各个包管理器&#xff0c;如果分享的不对或者有异议的地方&#xff0c;麻烦请及时告诉我~ 耐心看完&#xff0c;也许你会有所收获~ 概述 本文阅读时间&#xff1a;10-15分钟左右&#xff1b; 难度&#xff1a;初级&#xff0c…

django celery 异步任务 异步存储

环境&#xff1a;win11、python 3.9.2、django 4.2.11、celery 4.4.7、MySQL 8.1、redis 3.0 背景&#xff1a;基于django框架的大量任务实现&#xff0c;并且需要保存数据库 时间&#xff1a;20240409 说明&#xff1a;异步爬取小说&#xff0c;并将其保存到数据库 1、创建…

MAC(M1芯片)编译Java项目慢且发热严重问题解决方案

目录 一、背景二、排查三、解决四、效果以及结果展示五、总结 一、背景 使用idea编译项目等操作&#xff0c;经常性发热严重&#xff0c;并且时间慢。直到昨天编译一个项目用时30分钟&#xff0c;电脑温度很高&#xff0c;并且有烧灼的味道&#xff0c;于是有了此篇文章。 二、…

【网站项目】新冠疫苗预约小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

AI实时换天解决方案:重塑汽车与旅行拍摄新视界

在汽车拍摄与旅行摄影领域&#xff0c;天空作为画面中的重要元素&#xff0c;往往决定着整体视觉效果的成败。美摄科技作为业界领先的AI视觉技术提供商&#xff0c;近日推出了全新的AI实时换天解决方案&#xff0c;为用户带来了前所未有的创意空间与效率提升。 传统的换天技术…

libVLC 提取视频帧使用QGraphicsView渲染

在前面章节中&#xff0c;我们讲解了如何使用QWidget渲染每一帧视频数据&#xff0c;这种方法对 CPU 负荷较高。 libVLC 提取视频帧使用QWidget渲染-CSDN博客 后面又讲解了使用OpenGL渲染每一帧视频数据&#xff0c;使用 OpenGL去绘制&#xff0c;利用 GPU 减轻 CPU 计算负荷…

骑砍2霸主MOD开发(2)-基础开发环境搭建

一.骑砍2霸主程序架构 二.骑砍2霸主C#接口层代码查看 1.C#反编译工具dnspy下载: 2.骑砍2霸主游戏引擎接口查看: 例如IMBAgent interface接口: #调用TaleWorlds.Native.dll中的函数 [EngineMethod("get_movement_flags", false)] uint GetMovementFlags(UIntPtr agen…

【面试精讲】MyBatis设计模式及源码分析,MyBatis设计模式实现原理

【面试精讲】MyBatis设计模式及源码分析&#xff0c;MyBatis设计模式实现原理 目录 本文导读 一、MyBatis中运用的设计模式详解 1. 工厂模式&#xff08;Factory Pattern&#xff09; 2. 单例模式&#xff08;Singleton Pattern&#xff09; 3. 建造者模式&#xff08;Bu…

Java常见算法_常见的查找算法和排序算法——简介及代码演示

在本文中我将介绍Java中的常见算法&#xff0c;查找算法包括基本查找、二分查找、插值查找和分块查找。排序算法包括冒泡排序、选择排序、插入排序和快速排序 查找算法&#xff1a; 1.基本查找&#xff1a; 代码&#xff1a; public class BasicSearchDemo {public static …

电商技术揭秘十五:数据挖掘与用户行为分析

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

Harmony鸿蒙南向驱动开发-ADC

ADC&#xff08;Analog to Digital Converter&#xff09;&#xff0c;即模拟-数字转换器&#xff0c;可将模拟信号转换成对应的数字信号&#xff0c;便于存储与计算等操作。除电源线和地线之外&#xff0c;ADC只需要1根线与被测量的设备进行连接&#xff0c;其物理连线如图1所…

《前端面试题》- JS基础 - call()、apply()、bind() 的区别

call 、bind 、 apply 这三个函数的功能都是改变this的指向问题&#xff0c;但是也存在一定的区别。 call 的参数是直接放进去的&#xff0c;第二第三第 n 个参数全都用逗号分隔,apply 的所有参数都必须放在一个数组里面传进去bind 除了返回是函数以外&#xff0c;它 的参数和…

Idea中 maven 下载jar出现证书问题

目录 1&#xff1a; 具体错误&#xff1a; 2&#xff1a; 忽略证书代码&#xff1a; 3&#xff1a; 关闭所有idea&#xff0c; 清除缓存&#xff0c; 在下面添加如上忽略证书代码 4&#xff1a;执行 maven clean 然后刷刷新依赖 完成&#xff0c;撒花&#xff01;&#x…

DRF的认证、权限、限流、序列化、反序列化

DRF的认证、权限、限流、序列化、反序列化 一、认证 1、直接用&#xff0c;用户授权 实现方法 编写 ->认证组件 应用组件 编写 ->认证组件 from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions import AuthenticationF…

基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1遗传算法与模拟退火算法简介 4.2 GSAHO算法应用于JSSP 5.完整程序 1.程序功能描述 车间作业调度问题&#xff08;Job Shop Scheduling Problem, JSSP&#xff09;是一种典型的生产调度问…

数据仓库的概念和作用?如何搭建数据仓库?

随着企业规模的扩大和数据量的爆炸性增长&#xff0c;有效管理和分析海量数据成为企业数字化转型的关键。而在互联网的普及过程中&#xff0c;信息技术已深入渗透各行业&#xff0c;逐渐融入企业的日常运营。然而&#xff0c;企业在信息化建设中面临了一系列困境和挑战&#xf…