使用PHP上传文件以确保数据库也更新的最佳做法是什么?
目前的做法
1)表单验证确认所有字段都是有效的类型,长度和清除xss攻击。
2)使用用户提交的文件名
上传到服务器的文件3)使用用户提交的详细信息(包括文件名
)更新数据库这是一种安全的方式吗?最好先更新数据库,然后在数据库中查询文件名,然后使用数据库检索的文件名上传文件吗?
不是寻找代码而是寻找哲学。谢谢!
答案 0 :(得分:1)
表单验证是任何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");
}
答案 1 :(得分:0)
我会用这个顺序:
我强烈建议使用一些PDO
- 类似的库与数据库“对话”,因为它们抛出异常,而不是引发错误(如mysql_**
函数)。通过这种方式,您可以确定您的查询是否成功,而无需不断检查数据库函数的结果......