【问题标题】:How to set max file upload size and allow only certain file types on PHP upload?如何设置最大文件上传大小并仅允许 PHP 上传某些文件类型?
【发布时间】:2011-10-20 12:35:00
【问题描述】:

我做了一个 PHP 上传文件脚本。现在,我不希望人们上传巨大的文件,也不希望他们上传 PHP 文件。这是我当前的 PHP 脚本:

<?php
// Where the file is going to be placed 
$target_path = "files/";

/* Add the original filename to our target path.  
Result is "uploads/filename.extension" */
    $length = 10;
    $characters = '123456789abcdefghijklmnopqrstuvwxyz';
    $string="";
    for($p = 0; $p < $length; $p++) {
        $string .= $characters[mt_rand(0, strlen($characters))];
    }
$pos = strrpos(basename( $_FILES['uploadedfile']['name']), ".");
$ext = str_split(basename( $_FILES['uploadedfile']['name']), $pos);
$target_path = $target_path.$string.$ext[1]; 
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
    echo "<h2>Your file has been uploaded!</h2><br /><p>Your file has been uploaded successfully. <a href='".$target_path."'>Click here</a> to see the file you uploaded.
    <br /><br /><br />
    <h2>A link to your file</h2><br />The full link to your file is:
    <br /><br />
    <code>http://www.americaspoeticsoul.com/extras/upload/".$target_path."</code></p>";
} else{
    echo "<span class='error'>There was an error uploading the file, please try again.</span>";
}
?>

如何设置最大文件上传大小并仅允许某些文件类型,例如仅 JPEG、GIF、PNG 和 HTML 文件?

提前致谢,
内森

【问题讨论】:

    标签: php file-upload max


    【解决方案1】:

    您可以使用$_FILES['uploadedfile']["size"] 检查文件大小。客户端提供的文件类型在...["type"] 中可用。

    但是对于您的代码,您需要根据白名单探测 $ext 变量(仅仅寻找禁止的扩展可能不是一个好主意):

    if (in_array($ext, array("jpeg","gif","png","txt","html"))) {
        if (move_uploaded_file(...
    

    此时,建议考虑为所有上传检查使用现​​成的帮助程序类/脚本。你的代码已经很不可读了。

    【讨论】:

    • 我从未尝试过,但如果我在将扩展名重命名为 .jpg 后上传任意文件?
    • 谢谢,马里奥。我会看看这是否有效。我是 PHP 新手,所以将您上面提供的内容放入我的代码中可能会遇到一些麻烦。 ://
    • @Kumar 我不知道任意文件可以使用.jpg 扩展名?
    • @Kumar 这确实是个问题。但至少服务器上的 .jpg 扩展名不会触发 CGI 执行或 PHP 解释器在该上传文件上调用。 NTL 适当的Options 应通过上传文件夹中的.htaccess 设置。 (此外。更复杂的上传脚本会检查魔术字节并至少验证某些文件类型。)
    • 好吧@nathan想一想,我只是一心想破坏系统,我随机取一个文件并将其重命名为picture.jpg然后上传它,$_FILES['uploadedfile']['type']会识别它吗扩展名或文件内容的基础?
    【解决方案2】:

    请不要以连词开头。

    一、内容:

    简短的回答是您不能限制人们上传的文件类型。

    更长的答案是,您可以检查人们上传的文件类型,如果不符合您的要求,则将其丢弃。请注意,检查用户提供的 mimetype 或文件扩展名并不能提供太多保护。有一个很好的问题讨论和how to solve it here

    下一个尺寸:

    参见http://www.php.net/manual/en/features.file-upload.post-method.php 上的示例 #1 请注意,并非所有浏览器都尊重 MAX_FILE_SIZE 输入标签。文件大小也将受到该页面上列出的 php.ini 指令以及网络服务器上配置的请求和 POST 大小和超时的限制。

    顺便说一句,您生成文件名的方法相当冗长。使用 uniqid() 可能会更快,代码更少。使用 md5_file() 将具有相同的好处并防止重复。

    【讨论】:

    • 克服它,孩子,它只是一个连词。别这么挑剔了
    • @symcbean 这不是英语课,这是开发人员论坛,这意味着我不应该纠正我的问题。感谢您的回答,但我很确定 PHP 有办法限制大声播放的文件类型。关于大小,MAZ_FILE_SIZE 输入标签可以由用户使用 Chrome 中的开发者工具更改,如果我使用它,他们将能够将最大文件上传更改为他们想要的。我宁愿使用 PHP,因为它会更安全。我会查看您发布的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    相关资源
    最近更新 更多