修复PHP文件上传脚本中的常量字符串语法错误
问题分析与修复方案
核心语法错误原因
第11行的语法错误由两个直接问题导致:
- 代码中使用了HTML实体
"替代PHP原生引号,PHP无法识别这种实体,必须换成普通双引号"或单引号'。 - 该行赋值语句里存在全角空格(比如
$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>
修复要点说明
- 替换所有
"为普通双引号",确保PHP正确解析字符串。 - 将代码中的全角空格替换为半角空格,消除语法解析障碍。
- 新增
$file_ext变量定义,通过pathinfo提取扩展名并转小写,保证大小写不敏感判断。 - 补充服务端文件大小验证,弥补客户端限制的漏洞。
- 用
PHP_EOL处理换行提升跨平台兼容性,添加array_filter过滤空行优化输出效果。
内容的提问来源于stack exchange,提问作者kurtwagner
相关产品推荐
相关产品推荐

