zoukankan      html  css  js  c++  java
  • php函数伪静态、MVC单一入口与文件上传安全漏洞

    简介:这是php函数伪静态、MVC单一入口与文件上传安全漏洞的详细页面,介绍了和php,有关的知识、技巧、经验,和一些php源码等。

    class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=334787' scrolling='no'>

    php中有一个让人不解的特性,那就是,如果文件名中有".php",则会自动调用PHP引擎,当成PHP脚本处理。
    php的函数伪静态也是这样做出来的。
    以下是函数伪静态所用的函数:

    function MakeUrl($arr){ 
             foreach($arr as $key=>$value){ 
                     $url[]=$key."_".$value; 
             } 
             $tmpurl=implode("_",$url); 
             return $tmpurl.".htm"; 
    } 
    
    function ParseUrl(){ 
        if($_SERVER['PATH_INFO']!=""){ 
             $pathinfo=substr($_SERVER['PATH_INFO'],1); 
             $pathinfo=str_replace(".htm","",$pathinfo); 
             $path=explode("_",$pathinfo); 
             $count=count($path); 
             for($i=0;$i<$count;$i+=2){ 
                     $_GET[$path[$i]]=$path[$i+1]; 
             } 
        } 
    } 
    //使用实例,链接页面 
    $path="http://www.tiaotiaola.com/blog.php/"; 
    $path.=MakeUrl(array('BlogID'=>2,'page'=>1)); 
    以上两行代码生成页面中的URL。
    //浏览页面,调用函数ParseUrl();直接可以使用变量$_GET 
    
    

    当然,很多MVC框架中,均支持这样的功能,但在MVC框架中,并不一定是用上面两个函数实现的了。
    其实,它不仅是伪静态所需。同时也是MVC所必须要的功能。这是因为,MVC中的所谓的单一入口,也是凭此功能实现的。
    我们可以见到很多网站,链接象 http://www.tiaotiaola.com/s/2/3/4/5.html
    实际是经过.htaccess,或者是UrlRewrite处理过的。未处理之前是:http://www.tiaotiaola.com/s.php/2/3/4/5.html
    s.php一定是MVC的入口文件。
    这就是说,some.php.png,s.php/2/3/4/5.html这样的文件,均会当成PHP文件被执行。
    这也就引发了另一个问题:
    如果我上传一个文件,名为:some.php.png,那我肯定能够上传成功。
    因而,我就可以在上传成功后,再次请求这一个URL。于是,黑客攻击就能轻松实现。

    当然,要阻止这一问题并不难,第一,我们可以在上传目录增加一个.htaccess,内容如下,
    <Directory "/uploads/">
    <Files ~ ".php">
    Order allow,deny
    Deny from all
    </Files>
    </Directory>
    很显然,它的目的就是禁止文件以PHP方式执行。
    另外,最彻底的解决办法,则是:对所有的上传文件均进行改名。即不保存原始文件名。如果要保存,则必须去掉文件名中的"."以及其它可能有攻击性的语法。
    我们推荐的做法是不保存原始文件名,即对原始文件名用md5或sha进行hash,如果要区分上传时间,可以加上时间戳,即生成的是纯a-z0-9文字的文件名。最后加上原始扩展名即可。

    爱J2EE关注Java迈克尔杰克逊视频站JSON在线工具

    http://biancheng.dnbcw.info/php/334787.html pageNo:10
  • 相关阅读:
    解决编程开发时候文件命名的苦恼(规范代码 提高可读性)
    react的this.setState没有触发render
    动态修改JS对象的值及React setState
    Antd Select组件结合使用出现must set key for <rc-animate> children问题
    antd Select进阶功能 动态更新、函数防抖
    前端性能优化之重排和重绘
    ES5 map循环一大坑:循环遍历竟然出现逗号!
    Monent.js:强大的日期处理类库
    Docker概览
    Spring boot 集成hessian
  • 原文地址:https://www.cnblogs.com/ooooo/p/2247942.html
Copyright © 2011-2022 走看看