我有一个从 javascript 调用的 php 文件,目的是将文件上传到我的服务器。
澄清我正在做的是用 ajax 调用这个 php 文件,所以据我所知它不是在传统意义上运行的,这就是为什么我不使用 $_FILE 和 $_POST 作为这个项目的重点是处理文件上传/无需重新加载页面即可完成用户数据的收集。
显然我们想要某种服务器端文件验证,我已经在 if 语句中设置了它。
但是,无论我选择什么文件类型,代码都会成功并继续上传。
有人可以告诉我出了什么问题/或指导我朝正确的方向发展吗?
<?php
session_start();
$name = $_SESSION['name'];
$email = $_SESSION['email'];
$phone = $_SESSION['phone'];
$date = date('Y-m-d');
$mypath = $name . '-' . $phone . '-' . $date;
$ext = $_SERVER['HTTP_X_FILE_TYPE'];
$allow = array('psd', 'ai', 'eps', 'svg', 'jpg', 'png', 'docx', 'doc', 'pptx', 'ppt');
if(!in_array($ext,$allow)){
if(!file_exists($mypath)) {
mkdir($mypath,0777,TRUE);
}
$str = file_get_contents('php://input');
$title = $_SERVER['HTTP_X_FILE_NAME'];
$path = "$mypath/".$title;
file_put_contents($path,$str);
}else{
return false;
}
?>
非常感谢 - B先生
代码的问题是(就像评论中提到的@Cashbee),是if(!in_array($ext,$allow))
代码的一部分。这部分允许当文件扩展要上载的文件不是在$allow
阵列。正确的代码应该如下。
<?php
session_start();
$name = $_SESSION['name'];
$email = $_SESSION['email'];
$phone = $_SESSION['phone'];
$date = date('Y-m-d');
$mypath = $name . '-' . $phone . '-' . $date;
$ext = $_SERVER['HTTP_X_FILE_TYPE'];
$allow = array('psd', 'ai', 'eps', 'svg', 'jpg', 'png', 'docx', 'doc', 'pptx', 'ppt');
if(in_array($ext,$allow)){
if(!file_exists($mypath)) {
mkdir($mypath,0777,TRUE);
}
$str = file_get_contents('php://input');
$title = $_SERVER['HTTP_X_FILE_NAME'];
$path = "$mypath/".$title;
file_put_contents($path,$str);
}else{
exit;
}
?>
重要提示:请记住,基于浏览器的 javascript 命令设置的标头信任扩展程序具有高风险,不应信任。如果这是必需的,您必须将这些文件存储在一个文件夹中,要么无法访问/限制从网络访问,并根据请求使用正确的 mime 标头提供原始文件,或在上传时检查多个文件扩展名。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句