PHP $_SERVER['PHP_SELF']

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

假设我们有如下网址,$_SERVER['PHP_SELF']得到的结果分别为:

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'] 可以很方便的获取当前页面地址,因此一些程序员在提交表单数据到当前页面进行处理时,往往喜欢使用如下这种方式:

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

假设该页面地址为:

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

访问该页面,得到的表单 html 代码如下:

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

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

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

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

<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;

随机推荐

  1. java JNI 的实现(1)-又进一步加深对JVM实现的理解

    目录 概述 主要优点 主要缺点 JNI实现的简单例子 开发工具 简略步骤 1,在eclipse的 'java类' 中声明一个 'native方法'; 2,使用 'javah' 命令生成包含'nativ ...

  2. Android v2.0 基本概念 - 浅谈

    目录 Android框架 Linux Kernel 系统运行库 Libraries Android Runtime Application Framework Application Android框 ...

  3. pl/sql的工具导入和代码导入

    工具导入:在导入的文件中添加导入工具.导入imp:F:\app\Administrator\product\11.1.0\db_1\BIN\imp.exe导出exp:F:\app\Administra ...

  4. Delphi 串口打印机打印

    一.硬件准备 打印机: 打印机必须具有串口,没有标配串口的打印机,必须购买串口卡,串口卡的型号请参考随机<操作手册>. 计算机: 计算机必须具有串口,计算机通常具有两个串口:COM1和CO ...

  5. String对象

    <script type="text/javascript"> /* var str1 = new String("hello"); var str ...

  6. TTS异步+同步

    微软TTS使用说明 一.SAPI SDK的介绍 SAPI,全称是The Microsoft Speech API.就是微软的语音API.由Windows Speech SDK提供. Windows S ...

  7. 简单运用 activity 的 button 点击事件

    今天我们要讲的主要是四大组件之一Activity Activity 在英文中是活动的意思.活动就是我们与用户进行交互的一个场所. activity 整个的活动流程是什么呢?我们用一个图来看下 当然今天 ...

  8. swift代码排版-参考

    代码排版包括: 空行.空格.断行和缩进等内容.代码排版内容比较多工作量很多,但是非常重要. 空行 空行将逻辑相关的代码段分隔开,以提高可读性.下列情况应该总是添加空行: 类型声明之前. import语 ...

  9. C51 的重入问题 WARNING L15: MULTIPLE CALL TO SEGMENT

    WARNING L15: MULTIPLE CALL TO SEGMENT 这个问题必须注意,可能引起程序冲突,假设你用于自动化领域,则可能导致信号产生尖峰. 产生这一警告的一个根源是:你在主循环里调 ...

  10. JavaScript 比较操作符,严格比较===

    JavaScript 有两种比较方式:严格比较运算符和转换类型比较运算符.对于严格比较运算符(三个 =)来说,为ture的情况是仅当两个操作数拥有相同的类型,而对于被广泛使用的比较运算符(两个 =)来 ...