在 Symfony3 上验证文件扩展名
Validate file extension on Symfony3
我想在上传文件之前在 Symfony3 上验证文件扩展名。到目前为止,我一直在使用这段代码(这是一个简化版本,只是用作片段):
if ($form->isSubmitted() && $form->isValid()) {
$form->handleRequest($request);
$file = $form->get('file')->getData();
$ext = $file->guessExtension();
if($ext !== 'myextension' ){
die('not allowed');
}
$name = md5($file->getClientOriginalName().time());
$full_name = $name.'.'.$ext;
$dir = __DIR__.'/../../../web/upload';
$file->move($dir,$full_name);
}
问题是:文件会上传到temp目录吗?这安全吗?有更好的方法吗?我最担心的是有人试图上传二进制文件或脚本。谢谢
编辑(感谢 Gabriel Diez):该文件是一个实体的 属性。我用assert来声明它:
/**
* @Assert\File(maxSize="20M")
*/
private $file;
我认为更好的方法是使用 Symfony 来保护它。由于此文件是实体的一部分,您可以使用 Assert/File 注释来添加一些约束和安全性。
/**
* @Assert\File(
* maxSize = "20M",
* mimeTypes = {"application/pdf", "application/x-pdf"},
* mimeTypesMessage = "Please upload a valid PDF"
* )
*/
private $file;
有了这个,Symfony 将在服务器端处理这个问题,并且 return 如果类型不允许,则会向用户显示一个错误。此外,通过这种方法,您可以确定用户只能上传可用类型的文件。
您可以找到现有 MIME 类型列表 here and a list of all constraints of symfony available here。
我想在上传文件之前在 Symfony3 上验证文件扩展名。到目前为止,我一直在使用这段代码(这是一个简化版本,只是用作片段):
if ($form->isSubmitted() && $form->isValid()) {
$form->handleRequest($request);
$file = $form->get('file')->getData();
$ext = $file->guessExtension();
if($ext !== 'myextension' ){
die('not allowed');
}
$name = md5($file->getClientOriginalName().time());
$full_name = $name.'.'.$ext;
$dir = __DIR__.'/../../../web/upload';
$file->move($dir,$full_name);
}
问题是:文件会上传到temp目录吗?这安全吗?有更好的方法吗?我最担心的是有人试图上传二进制文件或脚本。谢谢
编辑(感谢 Gabriel Diez):该文件是一个实体的 属性。我用assert来声明它:
/**
* @Assert\File(maxSize="20M")
*/
private $file;
我认为更好的方法是使用 Symfony 来保护它。由于此文件是实体的一部分,您可以使用 Assert/File 注释来添加一些约束和安全性。
/**
* @Assert\File(
* maxSize = "20M",
* mimeTypes = {"application/pdf", "application/x-pdf"},
* mimeTypesMessage = "Please upload a valid PDF"
* )
*/
private $file;
有了这个,Symfony 将在服务器端处理这个问题,并且 return 如果类型不允许,则会向用户显示一个错误。此外,通过这种方法,您可以确定用户只能上传可用类型的文件。
您可以找到现有 MIME 类型列表 here and a list of all constraints of symfony available here。