一、背景

突然想起来之前面试的一些面试题,让我写出几个服务器变量$SERVER代表的意思。。实话实说,这些东西已经忘记很久了,都是用的时候直接上网查,今天再复习复习吧。

二、$SERVER

$_SERVER 是一个包含诸如头信息(header)、路径(path)和脚本位置(script locations)的数组。它是 PHP 中一个超级全局变量,我们可以在 PHP 程序的任何地方直接访问它。

1、$SERVER包含的参数

#测试网址:     http://localhost/blog/testurl.php?id=5//获取域名或主机地址
echo $_SERVER['HTTP_HOST']."<br>"; #localhost//获取网页地址
echo $_SERVER['PHP_SELF']."<br>"; #/blog/testurl.php//获取网址参数
echo $_SERVER["QUERY_STRING"]."<br>"; #id=5//获取用户代理
echo $_SERVER['HTTP_REFERER']."<br>"; //获取完整的url
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
#http://localhost/blog/testurl.php?id=5//包含端口号的完整url
echo 'http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
#http://localhost:80/blog/testurl.php?id=5//只取路径
$url='http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"];
echo dirname($url);
#http://localhost/blog
//其他的
$_SERVER['REQUEST_URI']:访问此页面所需的 URI 。
$_SERVER['SCRIPT_FILENAME']:当前运行 PHP 程序的绝对路径及文件名。
$_SERVER['argv']:传递给当前 PHP 程序的参数。

以上是一些常用的$SERVER数组。

2、关于 $SERVER[HTTP_HOST]$SERVER[SERVER_NAME ]的区别

这部分具体参考链接:
php $_SERVER中的SERVER_NAME 和HTTP_HOST的区别

当满足以下三个条件时,两者会输出相同信息。
1. 服务器为80端口
2. apache的conf中ServerName设置正确
3. HTTP/1.1协议规范

建议使用$SERVER[‘HTTP_POST’]比较稳定一些

3、关于$_SERVER["REQUEST_URI"]

之前在网上经常会遇到使用$_SERVER[“REQUEST_URI”] 取不到值的情况,后面才知道,这个变量只有 apache 才支持,如果你使用的是nginx或者其他服务器,需要用其他方式获得

<?php// 说明:获取 _SERVER['REQUEST_URI'] 值的通用解决方案
// 来源:drupal-5.1 bootstrap.inc
// 整理:CodeBit.cn ( http://www.CodeBit.cn )function request_uri()
{if (isset($_SERVER['REQUEST_URI'])){$uri = $_SERVER['REQUEST_URI'];}else{if (isset($_SERVER['argv'])){$uri = $_SERVER['PHP_SELF'] .'?'.$_SERVER['argv'][0];}else{$uri = $_SERVER['PHP_SELF'] .'?'.$_SERVER['QUERY_STRING'];}}return $uri;
}?>

三、关于PHP的$_SERVER[‘PHP_SELF’]造成的XSS漏洞攻击及其解决方案

参考链接:
PHP的$_SERVER[‘PHP_SELF’]造成的XSS漏洞攻击及其解决方案

这部分,笔者建议:

1、htmlentities

htmlentities($_SERVER['PHP_SELF'])来替代简单的$_SERVER[‘PHP_SELF’],这样即使网址中包含恶意代码,也会被“转换”为用于显示的html代码,而不是被直接嵌入html代码中执行,简单一点说,就是“<”会变成“<”,变成无害的了。

2、REQUEST_URI

$_SERVER["REQUEST_URI"]来替代$_SERVER[‘PHP_SELF’],在phpinfo()中可以看到这两个变量的区别:

$_SERVER[”REQUEST_URI”]    :   /fwolf/temp/test.php/%22%3E%3Cscript%3Ealert(’xss’)%3C/script%3E%3Cfoo
$_SERVER[”PHP_SELF”]     :    /fwolf/temp/test.php/”> $_SERVER["REQUEST_URI"]会原封不动的反映网址本身,网址中如果有%3C,那么你得到的也将会是%3C,而$ _SERVER['PHP_SELF']会对网址进行一次urldecode操作,网址中的%3C将会变成字符“<”,所以就产生了漏洞。

需要注意的是,在很多情况下,浏览器会对用户输入要提交给web服务器的内容进行encode,然后服务器端程序会自动进行decode,得到相应的原指,在我们进行post或者get操作的时候都是这样。

end

===============================================================
20180626补充:

php的$server['HTTP_ORIGIN']
这个参数在出现跨域请求的情况下,会返回请求的域名

我们可以在限制跨域请求的时候,使用该方法,获取访问的域名,如果该域名在我们的允许名单里,则生成一个新的header头

代码如下:

$allow_origin = array(  'http://pzhiliao.local','http://miaozhiliao.com','http://lux.xzhiliao.com/','http://svzhiliao.com/','http://www.xl.com/','http://appb.xzl.com:8080','http://appeb.xl.com','http://xu.apweb.xl.com',);//判断是否存在跨域,获取请求的域名$origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : '';//如果得到的域名在我们的array之内的话,则加个header头,解决跨域问题if(in_array($origin, $allow_origin)){  header("Access-Control-Allow-Origin:".$origin);}

php的服务器变量$SERVER以及防止$_SERVER['PHP_SELF']造成的XSS漏洞攻击及其解决方案相关推荐

  1. php server host,PHP $ _SERVER ['HTTP_HOST']与$ _SERVER

    我做了很多搜索,还阅读了PHP $ _SERVER文档.对于在我的网站中使用的简单链接定义,我的PHP脚本使用哪个权限? $_SERVER['SERVER_NAME'] 是基于您的Web服务器的配置文 ...

  2. PHP获取当前url路径的函数及服务器变量

    PHP获取当前url路径的函数及服务器变量: 代码如下: <?php echo $_SERVER['DOCUMENT_ROOT']."<br>"; //获得服务器 ...

  3. 数据库服务器(SQL SERVER)的安全设置

    数据库服务器(SQL SERVER)的安全设置 一.开发注点意 1.写好代码,运行拼接式的SQL语句要打醒12分精神,尽量用存储过程,或者是参数式的SQL语句,比如  [csharp] string ...

  4. 阿里云服务器 window server tomcat启动 并且关闭window防火墙 配置8080端口开放还是没用

    阿里云windows server  服务器开放端口 1.远程服务器关闭windows防火墙   不需要开放端口 2.阿里云管理平台开放指定的端口  如8081 阿里云服务器   window ser ...

  5. Linux下的Tomcat服务器修改server.xml中的8080端口号后出现不能访问首页

    QUESTION:Linux下的Tomcat服务器修改server.xml中的8080端口号后出现不能访问首页 ANSWER: 简单直接的有效方法:重装tomcat服务器.

  6. 服务器系统核心和带gui区别,Windows Server 2012图形用户界面(GUI)和服务器核心(Server Core)之间的切换...

    当安装 Windows Server 2012 时,咱们能够在"服务器核心安装"和"彻底安装"之间任选其一."带 GUI 选项的服务器"选项 ...

  7. eclipse中tomcat服务器locations不能修改,解决eclipse中Tomcat服务器的server location选项不能修改的问题...

    解决eclipse中Tomcat服务器的server location选项不能修改的问题 问题描述 编辑tomcat服务器时,server locations无法编辑,如下图: 解决方法 在Eclip ...

  8. php server(),php的$_SERVER参数详解(附实例)

    $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名,包含文件夹路径与 document root相关. $_SERVER['argv'] #传递给该脚本的参数,返回数组形式 $_SE ...

  9. 系统搜索资源就停止服务器,SQL Server (MSSQLSERVER) 服务启动不了,系统日志显示由于下列服务特定错误而终止: 找不到映像文件中指定的资源名。...

    系统日志报错: SQL Server (MSSQLSERVER) 服务由于下列服务特定错误而终止: 找不到映像文件中指定的资源名. SQL Server日志文件报错 2020-01-19 09:32: ...

最新文章

  1. 2022-2028年中国帘子布行业市场研究及前瞻分析报告
  2. CQRS实践(3): Command执行结果的返回
  3. 怎么获取请求头中的origin信息_委托单位代办汇算清缴时无法获取到我的专项附加扣除信息怎么办?...
  4. rhel5下samba的配置
  5. 这 12 款 IDEA 插件你用过几款?
  6. myeclipse搭建SSH框架
  7. 基于Zookeeper实现简易版服务的注册与发现机制
  8. mmap java_Java文件映射[Mmap]揭秘 | 学步园
  9. c++病毒代码(附源码)
  10. 软件工程复习提纲——第六章
  11. 整体大于部分_整体叶盘球头鼓锥形铣刀五轴加工技术
  12. 台式计算机操作系统的安装,台式电脑重装系统步骤图解
  13. 使用esp32-s2模拟实现usb多点触摸
  14. websocket站内信实时消息推送
  15. 基于 Springboot 和 Mybatis 的后台管理系统 BootDo | 软件推介
  16. 微信iOS新版支持手机、iPad、电脑同时在线
  17. C/C++开发程序员应有的素养
  18. 分页LIMIT和OFFSET关键字
  19. 解析机器人与人工智能领域的创新创业
  20. ImageView设置纯色图片颜色

热门文章

  1. macsv服务器状态,和利时macs问题(启动服务器无法读出控制器的点名)
  2. 欢乐拼图发红包微信小程序开发过程实录成品展示
  3. win10 编译姿态估计AlphaPose
  4. mxnet insightface特征提取
  5. einops 张量操作
  6. youtube-dl
  7. 一种比较省内存的稀疏矩阵Python存储方案
  8. 基于GPUImage的多滤镜rtmp直播推流
  9. 青龙羊毛——灰兔掌赚吹牛逼
  10. Windows下部署最新版青龙、诺兰、傻妞入门保姆级教程