野草CMS V5.2.1 任意文件删除漏洞
时间:2026-07-23 20:43
if($action== edit_member_ok ){ member php?action=edit_member_ok check_request(); 检查来路 if(!check_login()){ 检测是否登录会员 message(array( text =>$langua
if($action=='edit_member_ok'){ //member.php?action=edit_member_ok
check_request(); //检查来路
if(!check_login()){ //检测是否登录会员
message(array('text'=>$language['please_login'],'link'=>'member.php'));
}
...省略一堆无关东西
$member_photo_delete=empty($_POST['member_photo_delete'])?'':trim($_POST['member_photo_delete']);
..继续省略一堆无关东西
if(!empty($member_photo_delete)){
@unlink(ROOT_PATH."/uploads/".$member_photo_delete);
//直接删除了
}
作为一名深耕PHP开发多年的技术老手,我来用更贴近日常交流的方式重新解读这段代码,同时确保所有技术细节原封不动。
先说说这段代码的背景——它来自一个会员信息编辑模块(`member.php`),当用户提交编辑表单时,会触发`action=edit_member_ok`这个分支。这里面有几处关键的安全检查和文件操作,值得细细品味。
下面就是核心逻辑的代码实现:
if($action=='edit_member_ok'){ //member.php?action=edit_member_ok
check_request(); //检查来路
if(!check_login()){ //检测是否登录会员
message(array('text'=>$language['please_login'],'link'=>'member.php'));
}
...省略一堆无关东西
$member_photo_delete=empty($_POST['member_photo_delete'])?'':trim($_POST['member_photo_delete']);
..继续省略一堆无关东西
if(!empty($member_photo_delete)){
@unlink(ROOT_PATH."/uploads/".$member_photo_delete);
//直接删除了
}
注意看这里最值得警惕的部分——`@unlink`这一行。它直接拼接用户提交的`member_photo_delete`参数到上传路径下,然后执行删除。虽然用了`@`抑制错误,但这种“信任用户输入”的做法,在真实的线上环境中简直就是给攻击者留了一扇后门。想象一下,如果有人在表单里传了一个`../../../etc/passwd`之类的路径,后果会怎样?这种路径遍历漏洞在PHP文件删除安全中非常常见,也是很多老项目容易忽略的细节。
当然,这段代码的前面还有校验登录和检查请求来源的逻辑,至少确保了操作者是已登录会员,而且来源合法。但删除文件这种事,光靠一个`!empty()`判空远远不够,至少应该加个路径白名单、限制删除范围到上传目录,或者用`basename()`之类函数做过滤。这是很多PHP开发者容易忽略的细节,也是我在实际项目中反复强调的PHP安全防护要点。
另外,注释里的“省略一堆无关东西”也暗示了实际业务中可能还有其他字段处理,但核心风险点就集中在文件删除这里。如果要给这段代码打分——逻辑走通没问题,但安全系数确实得再提升一个档次。你要是接手这样的项目,第一件事就是把`unlink`路径做严格限制,比如使用`realpath`配合白名单检查,防止路径遍历攻击。这也是PHP开发中文件操作安全的最佳实践之一。