• 关于$_SERVER['PHP_SELF']用法及其安全性---改良


    网站来源:http://www.5idev.com/p-php_server_php_self.shtml

    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 后面随意加上攻击代码。要解决该问题,可以:

    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; 
  • 相关阅读:
    Linux如何设置时区/时间/上海时间
    Anaconda Python3.7环境 import _ssl DLL load failed(ImportError:DLL load failed:找不到指定模块)
    一行命令搞定/usr/bin/perl^M: bad interpreter
    Embed MP4 in HTML using flash-player(html5 video player)
    mp4文件转码为m3u8
    Python 下载图片的三种方法
    图解MySQL 内连接、外连接、左连接、右连接、全连接……太多了
    DOS批处理中%~dp0表示什么意思
    Android学习探索之App多渠道打包及动态添加修改资源属性
    Android学习探索之运用MVP设计模式实现项目解耦
  • 原文地址:https://www.cnblogs.com/sz-xioabai/p/6398068.html
Copyright © 2020-2023  润新知