You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修复PHP文件上传脚本中的常量字符串语法错误

问题分析与修复方案

核心语法错误原因

第11行的语法错误由两个直接问题导致:

  1. 代码中使用了HTML实体"替代PHP原生引号,PHP无法识别这种实体,必须换成普通双引号"或单引号'。
  2. 该行赋值语句里存在全角空格(比如$uploadedfile = "book.txt"中的空格是全角),PHP会将全角空格视为普通字符,引发语法解析失败。

其他隐藏功能问题

除了语法错误,代码还有几个影响功能的问题:

  • 变量$file_ext未定义,直接用于扩展名判断会触发报错。
  • explode使用硬编码换行符,跨平台兼容性差,建议用PHP_EOL或明确的"\n"。
  • 依赖$_FILES['userfile']['type']判断文件类型不可靠,该值可被客户端伪造,应通过扩展名或文件内容验证。
  • 仅靠客户端MAX_FILE_SIZE限制文件大小不安全,需在服务端补充验证。

修复后的完整代码

<?php

print('<pre>');
if(!isset($_FILES['userfile'])){
    $fname = "book.txt";
    // 用PHP_EOL适配跨平台换行,也可根据实际文件换行符改为"\n"
    $arrayk = explode(PHP_EOL, file_get_contents($fname));
    // 过滤空行,避免随机输出空内容
    $arrayk = array_filter($arrayk);
    $num = array_rand($arrayk, 1);
    print($arrayk[$num] . "<br>");
}else{
    $uploadedfile = "book.txt";
    $extensions = array("txt");

    // 从上传文件名提取扩展名,转小写避免大小写问题
    $file_ext = strtolower(pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION));
    // 服务端限制文件大小(30KB)
    $max_file_size = 30000;

    if($_FILES['userfile']['size'] > $max_file_size){
        print("File size exceeds the limit of 30KB.");
    } elseif(in_array($file_ext, $extensions) === false){
         print("Extension not allowed, please choose a TXT file.");
    }else{
        if(move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadedfile)) {
            print("File is valid, and was successfully uploaded.\n");
        } else {
            print("Possible file upload attack!\n");
        }  
    }

    print("Here is some more debugging info:\n");
    print_r($_FILES);
}
print("</pre>");

?>
<!DOCTYPE html>
<html>
<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="index.php" method="POST">
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>
</html>

修复要点说明

  • 替换所有&quot;为普通双引号",确保PHP正确解析字符串。
  • 将代码中的全角空格替换为半角空格,消除语法解析障碍。
  • 新增$file_ext变量定义,通过pathinfo提取扩展名并转小写,保证大小写不敏感判断。
  • 补充服务端文件大小验证,弥补客户端限制的漏洞。
  • 用PHP_EOL处理换行提升跨平台兼容性,添加array_filter过滤空行优化输出效果。

内容的提问来源于stack exchange,提问作者kurtwagner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:20:38