PHP 使用 $_SERVER['PHP_SELF'] 获取当前页面地址及其安全性问题

PHP $_SERVER['PHP_SELF']

$_SERVER['PHP_SELF'] 表示当前 php 文件相对于网站根目录的位置地址,与 document root 相关。php

假设咱们有以下网址,$_SERVER['PHP_SELF']获得的结果分别为:html

http://www.5idev.com/php/ :/php/index.php
http://www.5idev.com/php/index.php :/php/index.php
http://www.5idev.com/php/index.php?test=foo :/php/index.php
http://www.5idev.com/php/index.php/test/foo :/php/index.php/test/foo

所以,能够使用 $_SERVER['PHP_SELF'] 很方便的获取当前页面的地址:程序员

$url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

以上面的地址为例,获得的结果以下:安全

http://www.5idev.com/php/index.php

上面是简单获取 http 协议的当前页面 URL ,只是要注意该地址是不包含 URL 中请求的参数(?及后面的字串)的。若是但愿获得包含请求参数的完整 URL 地址,请使用 $_SERVER['REQUEST_URI'] 。服务器

PHP $_SERVER['PHP_SELF'] 安全性

因为利用 $_SERVER['PHP_SELF'] 能够很方便的获取当前页面地址,所以一些程序员在提交表单数据到当前页面进行处理时,每每喜欢使用以下这种方式:ide

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">

假设该页面地址为:post

http://www.5idev.com/php/index.php

访问该页面,获得的表单 html 代码以下:网站

<form method="post" action="/php/index.php">

这段代码是正确的,可是当访问地址变成:url

http://www.5idev.com/php/index.php/test/foo

页面正常执行了,表单 html 代码变成:orm

<form method="post" action="/php/index.php/test/foo">

显然这段代码不是咱们指望的,攻击者能够在 URL 后面随意加上攻击代码。要解决该问题,能够:

  1. 使用 htmlentities($_SERVER['PHP_SELF']) 替代 $_SERVER['PHP_SELF'],让 URL 中可能的恶意代码转换为用于显示的 html 代码而没法执行。
  2. 能够的条件下,使用 $_SERVER['SCRIPT_NAME'] 或 $_SERVER['REQUEST_URI'] 替代 $_SERVER['PHP_SELF']
  3. 在公共代码里将 $_SERVER['PHP_SELF'] 进行重写:
$phpfile = basename(__FILE__);
$_SERVER['PHP_SELF'] = substr($_SERVER['PHP_SELF'], 0, strpos($_SERVER['PHP_SELF'], $phpfile)).$phpfile; 

本章节内容共分 6 部分:

  1. 1. PHP 服务器变量 $_SERVER
  2. 2. PHP 服务器环境变量 $_ENV
  3. 3. PHP 使用 $_SERVER['PHP_SELF'] 获取当前页面地址及其安全性问题
  4. 4. PHP $_SERVER['HTTP_REFERER'] 获取前一页面的 URL 地址
  5. 5. PHP $_SERVER['PHP_SELF']、$_SERVER['SCRIPT_NAME'] 与 $_SERVER['REQUEST_URI'] 之间的区别
  6. 6. PHP $_SERVER['SCRIPT_FILENAME'] 与 __FILE__ 的区别
相关文章
相关标签/搜索