博客列表 >0113,服务器常用变量$_SERVER,过滤器基础与序列化操作

0113,服务器常用变量$_SERVER,过滤器基础与序列化操作

曾
原创
2020年02月06日 22:14:011134浏览

WEB服务器变量

$_SERVER
它是一个包含诸如头部(header)、路径(path)、执行脚本文件(PHP_SELF)等当前服务器信息的数组。
通过PHP命令可以输出当前服务器信息进行查看

  1. <?php
  2. // 输出当前服务器具体数据
  3. echo '<pre>'.print_r($_SERVER,true).'</pre>';

可以看出输出的数据是一个二维数组

WBE服务器常用变量

1.SERVER_NAME

  1. <?php
  2. // 访问一个二维数组,直接在[]里面添加键名就行。
  3. // 获取并输出当前服务器主机名
  4. echo $_SERVER['SERVER_NAME'];



2.PHP_SELF

  1. <?PHP
  2. // 获取并输出当前PHP执行脚本(文件)的路径以及名称
  3. echo $_SERVER['PHP_SELF'];



3.REQUEST_METHOD

  1. <?PHP
  2. // 获取并输出当前发送数据请求的方式,因为没设置,默认就是GET方法
  3. echo $_SERVER['REQUEST_METHOD'];



4.QUERY_STRING

  1. <?PHP
  2. // 获取并输出当前地址栏上的查询字符串。
  3. echo $_SERVER['QUERY_STRING'];



5.SERVER_PORT
端口 80,是HTTP://协议, 端口443,是HTTPS://协议

  1. <?php
  2. // 获取并输出当前服务器开放的端口
  3. echo $_SERVER['SERVER_PORT'];



6.SERVER_URI

  1. <?php
  2. // 获取并输出当前PHP执行脚本(文件)的路径以及名称
  3. echo 'PHP_SELF输出为:'.$_SERVER['PHP_SELF'];
  4. echo '<HR>';
  5. // 获取并输出当前地址栏除主机名外的所有字符串
  6. echo 'REQUEST_URI输出为:'.$_SERVER['REQUEST_URI'];



7.HTTP_HOST

  1. <?php
  2. // 获取并输出当前服务器主机名
  3. echo 'SERVER_NAME输出为:'.$_SERVER['SERVER_NAME'];
  4. // 它的输出虽然和SERVER_NAME类似,但是它更安全可靠
  5. echo 'HTTP_HOST输出为:'.$_SERVER['HTTP_HOST'];



8.SCRIPT_FILENAME

  1. <?php
  2. // 获取并输出当前脚本(PHP文件)的绝对路径
  3. echo $_SERVER['SCRIPT_FILENAME'];



以上是关于服务器常用的变量

过滤器(常用)

1.filter_has_var:检测是否存在指定类型的变量,成功返回true,失败返回false
格式:filter_has_var(数组变量,’键名’)
数组变量包括 INPUT_GET,INPUT_POST,INPUT_COOKIE,INPUT_SERVER,INPUT_ENV里面的其中一个。
键名就是以上数组里面包含的需要过滤的键名即可。

  1. <?php
  2. // 使用过滤器检查$_GET['id']是否存在
  3. // INPUT_GET,'id',等价于$_GET['id']
  4. echo filter_has_var(INPUT_GET,'id') ? '存在ID' : '不存在';



2.filter_input:通过指定的数组变量获取其值,成功返回所请求的变量值,如果不存在,返回null
格式:filter_input(数组变量,’键名’)
数组变量包括 INPUT_GET,INPUT_POST,INPUT_COOKIE,INPUT_SERVER,INPUT_ENV里面的其中一个。
键名就是以上数组里面包含的需要过滤的键名即可。

  1. <?php
  2. // 检查ID,不存在,用gettype查看类型,可以发现为NULL
  3. echo 'ID值为:'.gettype(filter_input(INPUT_GET,'id'));



3.filter_var:调用用户定义的变量
格式:filter_var(用户自定义变量,过滤器参数)

  1. <?php
  2. $email = 'admin@qq.com';
  3. // filter_var,主要是过滤检测用户自定义的变量
  4. echo 'email返回值为:'.filter_var($email,FILTER_VALIDATE_EMAIL);


添加过滤参数(常用)

FILTER_VALIDATE_EMAIL:把值作为EMAIL格式验证

  1. <?php
  2. // FILTER_VALIDATE_EMAIL表示为把需要过滤的数值用EMAIL格式进行验证
  3. // 验证成功,输出该值,失败返回false
  4. echo '邮箱验证正确输出为:'.filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL);



FILTER_SANITIZE_URL:过滤掉(删除)字符串中所有非法的URL字符

  1. <?php
  2. // 首先创建一个关于URL(链接)的字符串
  3. $url = 'https://www.baidu.co、m';
  4. // 输出该字符串原始样子
  5. echo $url.'<hr>';
  6. // 过滤掉字符串里面非法的URL字符
  7. echo filter_var($url,FILTER_SANITIZE_URL);



FILTER_VALIDATE_INT:检测变量的值是否为整数

  1. <?php
  2. $num = 11.5;
  3. echo filter_var($url,FILTER_VALIDATE_INT) ? 'num的值为:' : 'num的值不为整数';



FILTER_SANITIZE_NUMBER_INT:把字符串转换为数值型,并删除字符串中非法的数值型字符(允许保留’+’、’-‘)

  1. <?php
  2. $num = '11.5+5+6@5';
  3. echo '原始值为:'.$num;
  4. echo '<hr>';
  5. echo filter_var($num,FILTER_SANITIZE_NUMBER_INT);


结合上面的函数,做一个简单的数据判断与页面访问的合法性

数据判断

  1. <?php
  2. //首先检测$_POST里面有没有email
  3. //filter_has_var,返回值为布尔值
  4. if(filter_has_var(INPUT_POST,'email')){
  5. //如果email有值,则检测它的值是否符合email格式
  6. //filter_input,返回值为email的值
  7. if(filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL)){
  8. //格式正确输出
  9. echo '邮箱正确';
  10. }else{
  11. //格式错误则输出
  12. echo '邮箱格式错误';
  13. }
  14. }else{
  15. //如果没检测到直接输出此条信息
  16. echo '没有检测到电子邮箱';
  17. }



页面访问合法性
1.$_SERVERL里的’HTTP_REFERER’

  1. <?php
  2. // HTTP_REFERER 返回值为页面跳转前的链接/路径(页面来源链接/路径)
  3. echo '跳转过来的页面链接为:'.filter_input(INPUT_SERVER,'HTTP_REFERER');



2.dirname(),参数是一个包含有指向一个文件的全路径的字符串。该函数返回去掉文件名后的目录名。

  1. <?php
  2. echo '跳转过来的页面链接为'.filter_input(INPUT_SERVER,'HTTP_REFERER');
  3. echo '<hr>';
  4. // dirname() 参数是一个包含有指向一个文件的全路径的字符串。该函数返回去掉文件名后的目录名。
  5. echo '输出为跳转过来的页面链接去掉文件名后的目录名:'.dirname(filter_input(INPUT_SERVER,'HTTP_REFERER'));



3.in_array()搜索数组中是否存在指定的值。

  1. <?php
  2. //创建一个数组
  3. $arr = ['a','b','c','d'];
  4. //创建一个变量,值与数组里有一个相同
  5. $value = 'b';
  6. if(in_array($value,$arr)){
  7. echo '在数组$arr中查询到与$value相同的值';
  8. }else{
  9. echo '未查询到相同的值';
  10. }



4.根据上面3个例子,组合起来,就可以写出一个只允许某些链接访问的页面

  1. <?php
  2. // 获取到跳转过来的页面地址
  3. $url = filter_input(INPUT_SERVER,'HTTP_REFERER');
  4. // 通过获取跳转页面的地址,来获取到除文件名外的其他链接信息
  5. $rusdir = dirname(filter_input(INPUT_SERVER,'HTTP_REFERER'));
  6. // 创建一个包含允许链接的数组
  7. $urls = [
  8. // 把获取到的链接目录,拼接上允许访问的文件名即可
  9. $rusdir.'/admin.php',
  10. $rusdir.'/reg.php',
  11. $rusdir.'/about.php',
  12. ];
  13. // 我是分割线
  14. echo '<hr>';
  15. // 使用in_array()函数查询当前跳转页面的链接是否合法(是否与事先创建的允许链接相同)
  16. if(in_array($url,$urls)){
  17. echo '链接来源合法';
  18. }else{
  19. echo '非法链接';
  20. }

图1

图2

1.序列化函数serialize(),参数为数组,返回值为字符串,但是它会保留序列化以前的类型与结构

  1. <?php
  2. // 序列化
  3. // 创建一个数组
  4. $arr = [50,'abc','123',9];
  5. // 序列化它并赋值给前面的变量
  6. $item = serialize($arr);
  7. echo $item;



2.反序列化unserialize()参数为序列化后的值,返回值为数组

  1. <?php
  2. $a1 = unserialize('a:4:{i:0;i:50;i:1;s:3:"abc";i:2;s:3:"123";i:3;i:9;}');
  3. echo '$a1的类型为:'.gettype($a1).'<hr>';
  4. echo '$a1的值为:<pre>'.print_r($a1,true).'</pre>';


又完成一节课程了,这节课在最开始看的时候,感觉很迷茫,特别是过滤器与服务器变量,第一遍看的时候一脸懵逼。然后在看第二遍的时候,一遍观看,一遍对照PHP手册,终于看懂了,但是如果不多练习,感觉过几天又得搞忘- -,所以这次写的比较细,就是怕忘记了,回看笔记的时候又看不懂,那就太难了(=。=###)。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议