首先声明,我不是干坏事的,
只是前几天在试着做大文件上传的是时候,搜索有关方面的文章,提到表单中MAX_FILE_SIZE可以限制文件上传的大小的时候,都会附带一句,这一项可以很容易的被绕过,但是继续找找,却没有文章介绍这一项是被如何绕过去的,
很是纠结。
在此求大侠指教,所谓的很容易被绕过去,到底是怎么绕的?以前有关说js的提交限制被绕过,是不是也是一样的原理?再次声明:我是学习用的,绝不搞破坏。

解决方案 »

  1.   

    我不知道这个问题经过这么多年是否已经改进,要知道提出这个问题的时候是05年了...https://bugs.php.net/bug.php?id=33666PHP关于文件上传部分,特别提到表单隐藏域:MAX_FILE_SIZE,意思是接收文件的最大尺寸。文档中给出的例子如下:<form enctype="multipart/form-data" action="_URL_" method="POST">
    <input type="hidden" name="MAX_FILE_SIZE" value="30000">
    Send this file: <input name="userfile" type="file">
    <input type="submit" value="Send File">
    </form>这 里设置MAX_FILE_SIZE = 30000,期待一种可能,使得浏览器在传送文件之前能够依此作出预先判断,如果文件尺寸大于30000字节,则不执行实际的POST动作。也就是不往服 务器发送文件内容,而是直接在客户端提醒用户“你试图上传的文件超过30000字节”。这的确是一个非常棒的主张,但在现实中却暂时无法实现。不是因为这个限制可以“被简单地绕过”,而是IE和FireFox这两个主流浏览器都不支持这个特性。PHP的这个建议尚未被采纳。MAX_FILE_SIZE还有一个用场:后台PHP会判断接收到的文件大小是否大于这个值,如果超出,$_FILES['thisfile']['error']会被设置为UPLOAD_ERR_FORM_SIZE(2),同时放弃保存临时文件,将$_FILES['thisfile']['size']置0。这个例子,没问题,表现正常,当我试图上传一个40多K的文件时,PHP程序报告“文件超过MAX_FILE_SIZE”。但是,如果我们将表单中的MAX_FILE_SIZE从30000减少到1000,情形又如何呢?    上传800字节的文件,正常;
        上传40K的文件,PHP报告文件过大,也正常;
        上传3000个字节的文件,PHP未报告错误,它成功保存了文件!出乎意料!问题就出在main/rfc1867.c中判断文件是否超长的这部分代码上。php每次从buffer中读取FILLUNIT字节长度的内容后,首先判断“已经读到的内容长度(total_bytes)”是否大于MAX_FILE_SIZE,然后再增加“已经读到的内容长度(total_bytes)”。这样一来,和预计的结果之间至多会有FILLUNIT字节的误差,而FILLUNIT=1024*5=5K。(点击bug了解详细内容)这就是说,当MAX_FILE_SIZE<5K时,上传一个大于MAX_FILE_SIZE,但是小于5K的文件是没有问题的。当然,因为这个设置很容易被绕过,所以服务器端编程不应当依赖于MAX_FILE_SIZE。而且,5K到底是个很小的数值,对大多数上传文件的表单来说没有影响。btw, PHP中post_max_size,upload_max_filesize, MAX_FILE_SIZE的设置,和客户端上传给服务器端的流量大小无关。Apache服务器从客户端接收长度不超过LimitRequestBody字节数的请求,然后传送给php模块,php模块再决定是否保存成临时文件,设置$_FILES全局变量,移交给script进一步处理。这个Apache的LimitRequestBody选项缺省值=0,允许Request body的最大字节数是2G(Linux + Apache)
      

  2.   

    谢一楼回答,
    这篇文章之前见过,莫非今见到幕后真人了!!
    我想问问下,那个
    main/rfc1867.c
    文件是什么玩意,
    .c的文件是c的文件后缀,这是不是代表着php的默写功能实际上也是在调用后台的c代码来实现(只是在猜)。
    如果真是这样,那么这些文件在哪?
    或者php如何调用他??额··,是不是问题太大了?
    那么,我该去找什么样的书来学习这方面的知识呢?我学过标准c和标准c++,所以不用担心我看不懂c/c++。
      

  3.   

    PHP 于1994年由Rasmus Lerdorf创建,刚刚开始只是一个简单的用Perl语言编写的程序,用来统计他自己网站的访问者。后来又用C语言重新编写,包括可以访问数据库。帖子是转贴的。非本人的文章,所以也非幕后真人
    php不是有没有编译的原文件吗?php.net 要怎么学官方网站上应该有不少介绍
      

  4.   

    用firebug 改一下就ok了
    不过我没试过 去试一下吧
      

  5.   

    谢谢三楼的回答。
    四楼的朋友,
    你说的是
    firefox的那个插件吗??
      

  6.   

    是的 firefox很多插件 很好用
    我一直用那些