安全的唯一文件名,没有竞争条件

时间:2012-10-22 19:54:06

标签: php

这是一种根据竞争条件移动上传文件的安全方法吗?

do { 
    $file = $path . "/" . uniqid() . '.' . $ext; 
    $fh = @fopen($file, 'x'); 
} while( ! $fh);
move_uploaded_file($src, $file);

UPD 除了学习解决问题的其他方法外,我想知道这段代码是否符合竞争条件。 AFAIU,与'x'模式和move_uploaded_file一起使用是原子的,因此不可能发生冲突。

除此之外,关于“uniqid就足够了”,several people中的comments {{3}}表示必须使用fopen和'x'模式来避免竞争条件。他们过分偏执吗?我认为,如果不使代码变得非常复杂,那么更安全的解决方案会更好。

1 个答案:

答案 0 :(得分:1)

PHP的tempnam函数保证了唯一性。或者您可以使用基于microtimestamp的文件名(在MS-Windows下不起作用...)。