我有一个从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先生
答案 0 :(得分:2)
代码的问题是(与评论中提到的@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命令设置的标头的扩展程序存在高风险且不应受信任。如果需要,您必须将这些文件存储在Web上不可访问/受限制的文件夹中,并根据请求使用正确的mime头提供原始文件,或者在上传时检查文件扩展名以上。