使用PHP上传文件以确保数据库也更新的最佳实践是什么?
当前方法
1)表单验证确认所有字段类型、长度有效,无xss攻击。
2)使用用户提交的文件名上传到服务器的文件
3)使用用户提交的详细信息(包括文件名)更新数据库
这是安全的方式吗?首先更新数据库,然后查询数据库中的文件名,然后使用数据库检索到的文件名上传文件,这样会更好吗?
不一定是在寻找代码,而是在寻找哲学。谢谢!
发布于 2012-04-05 04:30:54
我将使用以下顺序:
第一种方法:依赖于操作顺序
删除记录
我强烈建议使用一些PDO-like库与数据库“对话”,因为这些库会抛出异常,而不是引发错误(如mysql_**函数)。这样,您就可以确定查询是否成功,而无需不断检查数据库函数的结果……
第二种方法:Transactions
如果文件已上载,则启动temp Form validation
发布于 2012-04-05 04:54:09
表单验证是任何web应用程序必不可少的一部分,所以在列表中看到这一点是很好的。您在这里结合了web应用程序中最危险的两个元素,文件上传和数据库交互,因此您显然需要小心处理。我猜这就是你问这个的原因!
在方法方面,我的建议是首先不要使用用户提交的文件名,这会打开一个你不需要的整个风险领域。除非这是应用程序的必需功能,否则在PHP中生成一个新的随机文件名,并使用move_uploaded_file从PHP分配的tmp_name复制到您的新随机文件名中。
一旦执行了此移动,您就可以使用文件的位置更新数据库。
因此,我的方法是:
根据白名单对任何用户提供的输入进行严格验证(a-z0-9作为suggestion).
我知道你不想要代码,但这里有几个来自我的工作文件上传的小片段,它不做数据库部分,但这将是直接添加。
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");
}https://stackoverflow.com/questions/10018643
复制相似问题