使用 PHP 上传文件以确保数据库也得到更新的最佳实践是什么?
目前的方法
1) 表单验证确认所有字段的类型、长度和 xss 攻击均有效。
2) 使用用户提交的文件名上传到服务器的文件
3) 使用用户提交的详细信息(包括文件名)更新数据库
这是一种安全的方式吗?先更新数据库,然后在数据库中查询文件名,然后使用数据库检索到的文件名上传文件会更好吗?
不一定要寻找代码,而是要寻找哲学。谢谢!
使用 PHP 上传文件以确保数据库也得到更新的最佳实践是什么?
目前的方法
1) 表单验证确认所有字段的类型、长度和 xss 攻击均有效。
2) 使用用户提交的文件名上传到服务器的文件
3) 使用用户提交的详细信息(包括文件名)更新数据库
这是一种安全的方式吗?先更新数据库,然后在数据库中查询文件名,然后使用数据库检索到的文件名上传文件会更好吗?
不一定要寻找代码,而是要寻找哲学。谢谢!
我会使用这个命令:
我强烈建议使用一些PDO
类似的库与数据库“对话”,因为这些会引发异常,而不是引发错误(如mysql_**
函数)。这样您就可以确定您的查询是否成功,而无需不断检查数据库函数的结果......
表单验证是任何 Web 应用程序的重要组成部分,因此很高兴在列表中看到它。您在这里结合了 Web 应用程序中最危险的两个元素,即文件上传和数据库交互,因此您显然需要谨慎行事。我想这就是你问的原因!
我在方法方面的建议首先是不要使用用户提交的文件名,这会打开你不需要的整个风险领域。除非这是您的应用程序的必需功能,否则请在 PHP 中生成一个新的随机文件名并使用 move_uploaded_file 从 PHP 分配的 tmp_name 复制到您的新随机文件名。
执行此移动后,您可以使用文件的位置更新数据库。
因此,我的方法是:
我知道你不是在追求代码,但这里有几个来自我上传的工作文件的小片段,它不做数据库部分,但添加起来很简单。
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’t specify a file to upload. Try again");
}