$_SERVER变量 以及 PHP 使用 $_SERVER['PHP_SELF'] 获取当前页面地址及其安全性问题
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 后面随意加上攻击代码。要解决该问题,可以:
- 使用 htmlentities($_SERVER['PHP_SELF']) 替代 $_SERVER['PHP_SELF'],让 URL 中可能的恶意代码转换为用于显示的 html 代码而无法执行。
- 可以的条件下,使用 $_SERVER['SCRIPT_NAME'] 或 $_SERVER['REQUEST_URI'] 替代 $_SERVER['PHP_SELF']
- 在公共代码里将 $_SERVER['PHP_SELF'] 进行重写:
$phpfile = basename(__FILE__);
$_SERVER['PHP_SELF'] = substr($_SERVER['PHP_SELF'], 0, strpos($_SERVER['PHP_SELF'], $phpfile)).$phpfile;
随机推荐
- c - 水仙花数.
#include <stdio.h> #include <math.h> /* *打印出所有的“水仙花数” ,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身. * ...
- Entity Framework 的枚举类型
新增数据模型,新增“实体”之后,新增“枚举类型”,创建Enum值,将“实体”中的列和Enum关联,选中“实体”中的列属性改变类型为Enum名称,生成数据库…… 如下转自:http://item.con ...
- oracle过滤名字中含有_的行
select * from emp where ename like '%\_%' escape '\'; escape 定义转义字符串,这样转义字符串后的字符就是普通字符.
- python记录
1. 序列的分片操作:需要提供两个索引作为边界,第1个索引的元素包含在分片内,第2个索引的元素不包含在分片内. 为了能让分片部分能够包含列表的最后一个元素,必需提供最后一个元素的下一个元素所对应的索引 ...
- 【转】Qt 事件处理机制 (下篇)
转自:http://mobile.51cto.com/symbian-272816.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生.分 ...
- HTML5 canvas 绘制五星红旗
这个例子并不是自己写的,在网上找的案列,仿照写的,,,自己真的公布董这些算法,看完这个例子还是有一点模糊,,, 如果谁看的比较明白,指点一下,,,多谢!!!! <!doctype html> ...
- sersync做实时同步(第二步)
配置文件一般都在sersync2的根目录下.为.xml文件 下面做逐行的进行解释说明: <host hostip="localhost" port="8008&qu ...
- 深入浅出Java 重定向和请求转发的区别
深入浅出Java 重定向和请求转发的区别 <span style="font-family:FangSong_GB2312;font-size:18px;">impor ...
- Python中else语句块(和if、while、for、try搭配使用)
学过C/C++的都知道,else语句是和if语句搭配使用的, 但是在Python中,else语句更像是作为一个模块,不仅仅可以和if语句搭配,还可以和循环语句,异常处理语句搭配使用.下面逐个进行介绍: ...
- OSTaskCreateExt() 建立任务
OSTaskCreateExt()建立任务 NT8U OSTaskCreateExt (void (*task)(void *pd), void *pdata, OS_STK *ptos, ...