文件 { include_once(dirname( FILE__).'/config.php'); } ...(略) $newname = ( empty($newname) ? '' : preg_replace("#[\\ \"\*\?\t\r\n<>':\/|]#", "", $newname) ); //②过滤新文件名中的正斜杠、反斜杠、空格、单引号等符号 ...(略) $uploadfile_name = trim(preg_replace("#[ \r\n\t\*\%\\\/\?><\|\":]{1,}#", '', $uploadfile_name)); if(!preg_match("#\.(".$cfg_softtype.")#i", $uploadfile_name)) { //$cfg_softtype = 'zip|gz|rar|iso|doc|xsl|ppt|wps' //③进行允许$cfg_softtype 类型判断。因为正则表达式缺少“$”,所以“.zip.asp” 将满足条件,还可以将上传文件的扩展名改为 rar 等。 ShowMsg("你所上传的{$uploadmbtype}不在许可列表,请更改系统对扩展名限定的 配置!",""); exit(); } if($activepath==$cfg_soft_dir) { //$cfg_soft_dir=$cfg_medias_dir.'/soft',提交空变量$activepath 使条件不成 立 ...(略) } if(!empty($newname)) //上传后的新文件名 { $filename = $newname; if(!preg_match("#\.#", $filename)) $fs = explode('.', $uploadfile_name); else $fs = explode('.', $filename); //④新文件名包含“.”,取新文件扩展名,否则取上传文件扩展名 if(preg_match("#".$cfg_not_allowall."#", $fs[count($fs)-1])) { //$cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml"; //⑤再次进行禁止$cfg_not_allowall 类型判断,因为正则表达式缺少“i”, 所以可以通过大写绕过 ShowMsg("你指定的文件名被系统禁止!",'javascript:;'); exit(); } if(!preg_match("#\.#", $filename)) $filename = $filename.'.'.$fs[count($fs)-1]; }else{ $filename = $cuserLogin->getUserID().'-'.dd2char(MyDate('ymdHis',$nowtme)); //自动生成文件名,由于 getUserID()函数定义在 userlogin.class.php 中,一 般无法调用,所以我们上传时指定新文件名 ...(略) } $fullfilename = $cfg_basedir.$activepath.'/'.$filename; //文件上传到网站根目 录 $fullfileurl = $activepath.'/'.$filename; move_uploaded_file($uploadfile,$fullfilename) or die(" 上 传 文 件 到 $fullfilename 失败!"); //⑥ PHP 的 move_uploaded_file() 函数 将上传的 文件 移动( 复制) 到新 位置 的 $fullfilename 文件。 与 include/dialog 目录其他文件不同,没有直接包含 config.php 文件(包含 config.php 文件时,会要求以管理员身份登录后才能继续访问),而是增加了语句①进行判 断$cfg_basedir 变量,如果没有定义则强制包含 config.php 文件,这样的意图是不允许直 接访问 select_soft_post.php 文件,但是这样做同样是危险的,一旦$cfg_basedir 变量已 经定义,将绕 过 config.php 文件的限制,具体的方法是以包含方 式调 用 select_soft_post.php。因为语句②过滤了正反斜杠,所以不能进行目录跳转,默认上传到 网站根目录。语句③进行允许$cfg_softtype 类型判断,因为正则表达式缺少“$”,所以 “.zip.asp”将满足条件,还可以将上传文件扩展名改为允许上传的类型,如 rar 等。语句 ④判断新文件名是否包含“ .”,是则取新文件名的扩展名,语句⑤再次进行禁止 $cfg_not_allowall 类型判断,因为正则表达式缺少“i”,所以可以通过大写绕过,语句⑥ 完成上传文件的复制。 包含方式调用 select_soft_post.php。由于语句①要求$cfg_basedir 变量必须初始化, 所以必须以包含方式调用 select_soft_post.php 文件,才能绕过 config.php 文件限制。分 析页面“/plus/carbuyaction.php”主要代码如下: |