PHP文件上传源码分析_第1页
PHP文件上传源码分析_第2页
PHP文件上传源码分析_第3页
PHP文件上传源码分析_第4页
PHP文件上传源码分析_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PHP文件上传源码分析文件上传,一般分为俩种方式FTP和,对于我们的互联网应用来说:FTP上传虽然传输稳定,但是易用性和安全性都是个问题.你总不至于在用户要上传头像的时候告诉用户”请打开FTP客户端,上传文件到.laruence./uploads/中,并以2dk433423l.jpg命名”吧?基于的上传,相对来说易用性和安全性上就比FTP要增强了很多.可以应用的上传方式有PUT,WEBDAVJRFC186E种,本文将分析在PHP中,是如何基于RFC186殡现文件上传的.RFC1867RCF1867是Form-basedFileUploadinHTML标准协议,RFC1867标准对HTML故出了

2、两处修改:1为input元素的type属性增加了一个file选项。2input标记可以具有aept属性,该属性能够指定可被上传的文件类型或文件格式列表。另外,本标准还定义了一种新的mime类型:multipart/form-data,以及当处理一个带有enctype=”multipart/form-data”并且/或含有的标记的表单时所应该采取的行为。举例来说,当HTML®让用户能够上传一个或更多的文件时,他可以这么写:选择文件:文件描述:这个表单,大家一定不陌生,而对于PH陈说,它自己另外定义了一个默认表单元素MAX_FILE_SIZE用户可以通过这个隐藏的表单元素来建议PHPM多

3、只容许上传文件的大小,比如对于上面的例子,我们希望用户上传的文件不能大于5000(5k)字节,那么可以如下写:选择文件:文件描述:姑且不说,这个MAX_FILE_SIZ匿多么的不可靠(所以基于浏览器的控制,都是不可靠的),我们单纯从实现来介绍这个MAX_FILE_SIZ匿如何起作用的.当用户选择了一个文件(xxxx.txt),并填写好文件描述,点击上传后,发生了什么呢?表单提交在用户确定提交以后,浏览器会根据用户选择的输入,读取要上传的文件,连同表单中的其他元素,组织成一定格式(如下)的数据发送到form中action属性指定的页面(在本例中是upload.php):/请求头POST/uplo

4、ad.php/1.0.Host:.laruenceContent-length:xxxxx.Content-type:multipart/form-data,boundary=7d51863950254开始POS改据内容-7d51863950254content-disposition:form-data;name="description"laruence的个人介绍-7d51863950254content-disposition:form-data;name="userfile;filename="laruence.txt"Content-

5、Type:text/plain.laruence.txt的内容.-7d51863950254-接下来,就是服务器,是如何处理这些数据了.接受上传当Web服务器,此处假设为Apache(另外假设PHPM以module方式安装在Apache上的),接受到用户的数据时,首先它根据请求头,通过确定MIMETYPEPH陵型,然后经过一些过程以后,最终会把控制权交给PHPJI块.这个时候,PHP会调用sapi_activate来初始化一个请求,在这个过程中,首先判断请求类型,此时是POST从而去调用sapi_read_post_data,通过Content-type,找到rfc1867的处理函数rfc18

6、67_post_handler,从而调用这个handler,来分析POS球的数据.关于rfc1867_post_handler这部分的源代码,可以在mian/rfc1867.c找到,其中也列出的源代码.然后,PHP通过boundary,对于每一个分段,都通过检查,是否同时定义了:name和filename属性(有名文件上传)没有定义name定义了filename(无名上传)定义了name没有定义filename(普通数据),从而进行不同的处理if(cd=php_mime_get_hdr_value(header,"Content-Disposition")char*pair

7、=NULL;intend=0;while(isspace(*cd)+cd;while(*cd&&(pair=php_ap_getword(&cd,'')char*key=NULL,*word=pair;while(isspace(*cd)+cd;if(strchr(pair,'=')key=php_ap_getword(&pair,'=');if(!strcasecmp(key,"name")/获取name字段if(param)efree(param);param=php_ap_getword_

8、conf(&pairTSRMLS_CC);elseif(!strcasecmp(key,"filename")/获取filename字段if(filename)efree(filename);filename=php_ap_getword_conf(&pairTSRMLS_CC);if(key)efree(key);efree(word);在这个过程中,PHP会去检查普通数据中,是否有MAX_FILE_SIZE./*Normalformvariable,safetoreadalldataintomemory*/if(!filename&&pa

9、ram)unsignedintvalue_len;char*value=multipart_buffer_read_body(mbuff,&value_lenTSRMLS_CC);unsignedintnew_val_len;/*Dummyvariable*/if(!strcasecmp(param,"MAX_FILE_SIZE")max_file_size=atol(value);efree(param);efree(value);continue;有的话,就会按照它的值来检查文件大小是否超出.if(PG(upload_max_filesize)>0&

10、;&total_bytes>PG(upload_max_filesize)cancel_upload=UPLOAD_ERROR_A;elseif(max_file_size&&(total_bytes>max_file_size)#ifDEBUG_FILE_UPLOADsapi_module.sapi_error(E_NOTICE,"MAX_FILE_SIZEof%ldbytesexceeded-file%s=%snotsaved",max_file_size,param,filename);#endifcancel_upload=UPL

11、OAD_ERROR_B;通过上面的代码,我们也可以看到,判断分为俩部,第一部分是检查PH谶认的上传上限.第二部分才是检查用户自定义的MAX_FILE_SIZE所以表单中定义的MAX_FILE_SIZ/不能超过PH冲设置的最大上传文件大小.通过对name和filename的判断,如果是文件上传,会根据php的设置,在文件上传目录中创建一个随机名字的临时文件:if(!skip_upload)/*Handlefile*/fd=php_open_temporary_fd_ex(PG(upload_tmp_dir),"php",&temp_filename,1TSRMLS_C

12、C);if(fd=-1)sapi_module.sapi_error(E_WARNING,"Fileuploaderror-unabletocreateatemporaryfile");cancel_upload=UPLOAD_ERROR_E;返回文件句柄,和临时随机文件名.之后,还会有一些验证,比如文件名合法,name合法等.如果这些验证都通过,那么就把内容读入,写入到这个临时文件中.elseif(blen>0)wlen=write(fd,buff,blen);/写入临时文件.if(wlen=-1)/*writefailed*/#ifDEBUG_FILE_UPLOADsapi_module.sapi_error(E_NOTICE,"write()failed-%s",strerror(errno);#endifcancel_upload=UPLOAD_ERROR_F;当循环读入完成后,关闭临时文件句柄.记录临时变量名:zend_hash_add(SG(rfc1867_uploaded_files),temp_filename,strlen(temp_filename)+1,&temp_filename,sizeof(char*),NULL);并且生成F

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论