首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP文件上载-确保文件已上载且数据库已更新

PHP文件上载-确保文件已上载且数据库已更新
EN

Stack Overflow用户
提问于 2012-04-05 04:18:53
回答 2查看 1.4K关注 0票数 0

使用PHP上传文件以确保数据库也更新的最佳实践是什么?

当前方法

1)表单验证确认所有字段类型、长度有效,无xss攻击。

2)使用用户提交的文件名上传到服务器的文件

3)使用用户提交的详细信息(包括文件名)更新数据库

这是安全的方式吗?首先更新数据库,然后查询数据库中的文件名,然后使用数据库检索到的文件名上传文件,这样会更好吗?

不一定是在寻找代码,而是在寻找哲学。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-05 04:30:54

我将使用以下顺序:

第一种方法:依赖于操作顺序

  • Form validation
  • Check如果文件已上载(暂时不要从临时文件中移动)
  • 根据您自由选择的文件名生成新文件名
  • 使用新生成的文件名将有关文件的数据插入数据库
  • 然后,如果没有抛出异常,则使用<代码>E211中的文件名将文件从temp中移动。否则,文件将被自动删除的请求end
  • If文件移动失败,由于某种原因,您应该从database.

删除记录

我强烈建议使用一些PDO-like库与数据库“对话”,因为这些库会抛出异常,而不是引发错误(如mysql_**函数)。这样,您就可以确定查询是否成功,而无需不断检查数据库函数的结果……

第二种方法:Transactions

如果文件已上载,则启动temp Form validation

  • Check (请勿将其从temp,yet)

  • Generate新文件名移动到基于您自由选择的

  • 启动有关文件的yet)

  • Generate数据到数据库中使用新生成的文件名)。

  • 使用上面的文件名从临时文件中移动文件。如果由于某种原因文件移动失败,则抛出execption.

  • Commit transaction

  • At,此时您可以确保文件和数据都被正确地移动和保存。
票数 1
EN

Stack Overflow用户

发布于 2012-04-05 04:54:09

表单验证是任何web应用程序必不可少的一部分,所以在列表中看到这一点是很好的。您在这里结合了web应用程序中最危险的两个元素,文件上传和数据库交互,因此您显然需要小心处理。我猜这就是你问这个的原因!

在方法方面,我的建议是首先不要使用用户提交的文件名,这会打开一个你不需要的整个风险领域。除非这是应用程序的必需功能,否则在PHP中生成一个新的随机文件名,并使用move_uploaded_file从PHP分配的tmp_name复制到您的新随机文件名中。

一旦执行了此移动,您就可以使用文件的位置更新数据库。

因此,我的方法是:

根据白名单对任何用户提供的输入进行严格验证(a-z0-9作为suggestion).

  • Avoid将用户提供的数据回显到屏幕,如果您这样做,请使用用户提供的数据输出encode to
  1. HTML entities.
  2. Avoid以输入到数据库或文件名,生成一个新的文件名,然后在执行一些验证检查后,使用新文件名将图像移动到其新位置。

我知道你不想要代码,但这里有几个来自我的工作文件上传的小片段,它不做数据库部分,但这将是直接添加。

代码语言:javascript
复制
function generate_filename() {
    // could be improved upon really
    $random_string = random_string(8);
    $filename = $random_string . time() . ".jpg";
    return $filename;    
}



if ($_FILES["file_upload"]["size"] != 0) {
    $file_name = generate_filename();
    $file_path = "/" . $upload_directory . "/" . $file_name;
    $target_file_name = SITE_ROOT . $file_path; // SITE_ROOT is a constant for the file system location. This could be /var/www/images for example.

    if ($_FILES["file_upload"]["type"] == "image/jpeg") {
        if (getimagesize($_FILES["file_upload"]["tmp_name"])) {
            if (move_uploaded_file($_FILES["file_upload"]["tmp_name"],$target_file_name)) {
                exit_status("File uploaded successfully to $file_path");
            } else {
                exit_status("Eek, something went wrong with your image upload");
            }
        } else {
            exit_status("Not a valid image");
        }
    } else {
        exit_status("Invalid file type. We only support JPEG");
    }
} else {
    exit_status("You didn&rsquo;t specify a file to upload. Try again");
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10018643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档