1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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
;
|
本文转自 IT阿飞 51CTO博客,原文链接:http://blog.51cto.com/itafei/1867584