php怎么开启%3c%3e,PHP中的$_SERVER(PHP_SELF)

复习PHP表单时,在教程中看到这个问题,然后了解一下。

先来说说这个超级全局变量吧

其实我觉得这个变量还蛮有意思的。

$_SERVER[“PHP_SELF”]是超级全局变量,返回当前正在执行脚本的文件名,与 document root相关。

所谓 document root 就是apache服务器网页(文档)根目录

既然说到这个,那就补充一个知识点1

2

3

4

5

6

7

8

9

10

11documentroot 和directory的区别:

1.DocumentRoot

DocumentRoot指定apache服务器网页(文档)根目录

DocumentRoot "/home/iflow/apache2/htdocs"

它的作用是指定网站文件在服务器存放路径。

2..Directory

Directory是在只指定目录的情况下默认显示的文件名

Directory home.html index.html index.html.var index.shtml

作用是我打开网站时,输入 域名或者url+目录,如果目录下存在DirectoryIndex设置的文件名的文档,home.html index.html 等,默认就打开这样的文件。没有这些文档的话,打开存在的目录会显示Forbidden错误。

$_SERVER[‘PHP_SELF’],它的值是“当前php文件相对于网站根目录的位置地址”。

代码如下:1echo $_SERVER['PHP_SELF']; ?>

那么返回的内容就是1/output/html/data.php

那也就是说,一般情况下,我们通过什么地址访问某网站,就会返回什么样的document root。1

2

这么一段代码,看着没什么问题,本来看来这段代码其实是挺方便的,对于调用代码。

如果我们访问 http://…/test.php/a=1

那么我们将得到如下的客户端代码:

(假如该代码所在页面是http://www.shuihan.com/form.php )1

2

那么这时候如果我们使用XSS跨站攻击。

我们访问 http://www.shuihan.com/form.php%22%3E%3Cscript%3Ealert(‘XSS attack!’)%3C/script%3E%3Cbr

那么实际上客户端代码为:1

2

3

4

5

一次XSS攻击完成。

如何修复

方法一

$_SERVER[“PHP_SELF”] 可以通过 htmlspecialchars() 函数来避免被利用。

form 代码如下所示:1

">

htmlspecialchars() 把一些预定义的字符转换为 HTML 实体。现在如果用户想利用 PHP_SELF 变量, 结果将输出如下所示:1

这样即使网址中包含恶意代码,也会被“转换”为用于显示的html代码,而不是被直接嵌入html代码中执行,简单一点说,就是”

方法二

用$_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将会变成字符”

另外还有两点需要指出,第一是这种写法虽然没有直接用到$_SERVER[‘PHP_SELF’],但实际效果却是一样的,只是发生的时间错后到了用户提交之后的下一个页面,所以,form的action还是不要留空的好。第二点,除了PHP_SELF之外,其他的$_SERVER变量也许也会有类似的漏洞,比如SCRIPT_URI, SCRIPT_URL, QUERY_STRING, PATH_INFO, PATH_TRANSLATED等等,在使用他们之前一定要先作htmlentities之类的

FILE和$_SERVER[“PHP_SELF”]的区别1

2

3

4

5

6_FILE_:a文件include b文件,在b文件中echo __FILE__,显示的是b的路径

$_SERVER["PHP_SELF"]:a文件include b文件,在b文件中echo $_SERVER["PHP_SELF"],显示的是a的路径

但是如果是a include b,b include c

那么c里面echo $_SERVER["PHP_SELF"]会返回a的URL,而不会返回b的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值