php如果语句没有失败作为ajax调用的一部分

时间:2018-03-09 12:56:06

标签: javascript php ajax

我有一个从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先生

1 个答案:

答案 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头提供原始文件,或者在上传时检查文件扩展名以上。