有没有可能&ok使用rename()代替move_uploaded_file()通过HTML/PHP上传文件


Is it possible & ok to use rename() instead of move_uploaded_file() when uploading a file via HTML/PHP

我想知道它是否可以&可以用rename函数代替move_uploaded_file。有安全问题吗?

原因是我正在构建一个File类,将处理所有文件上传和文件对象。我希望能够在不上传时在目录之间移动文件,我想有一个名为move的函数来做到这一点,我正在辩论我是否应该在该函数中使用move_uploading_file或重命名。

我认为这两个函数之间没有任何安全差异;如果您最关心的是安全性,那么要记住的主要事情是验证允许的大小、允许的字符、名称长度、允许的扩展名等。

move_uploaded_file()可能是您想要做的更具体的函数,但如果您正在制作一个扩展超出上传文件的"move"函数,我会使用rename()。

我之前想说的是你应该这样做:

function move($frompath, $topath, $isupload)
{
   if( $isupload )
   {
      //frompath should only be filename
      move_uploaded_file($frompath, $topath);
   }
   else
   {
      //frompath must be fullpath
      rename($frompath, $topath);
   } 
}

如果没有其他原因,只是不需要传入临时路径。但也存在安全问题。来自文档:

move_uploaded_file()既支持安全模式,也支持open_basedir。但是,限制只放在目标路径上允许移动上传的文件,其中文件名可能与这样的限制。Move_uploaded_file()确保了此操作的安全性操作,只允许通过PHP上传的文件被访问感动。

我不知道PHP黑名单上的所有目标路径,但我知道将Windows dll移动到c:' Windows 'system32将是一个坏主意。您可能也不会使用rename()这样做,但是如果有人上传了一个dll,并且您调用rename()而不是move_uploaded_file()怎么办?不太可能,但以防万一,不妨把事情做好。

主要区别在于move_uploaded_file()只适用于上传的文件。

引用文档:

此函数检查以确保指定的文件filename是一个有效的上传文件(这意味着它是通过PHP的HTTP上传的POST上传机制)。如果文件有效,它将被移动到文件名由目的地指定。

这种检查尤其重要,如果有任何可能对上传的文件所做的任何操作都可能将其内容泄露给用户,甚至同一系统上的其他用户。

所以,这是一个安全检查,以确保有人不会试图读取你的mysql.php文件或其他一些可疑的伎俩。

至于功能,它们是等效的——除了move_uploaded_file()是为它的目的而设计的,所以它做了一些额外的安全检查。

但是,除了上传的文件,你不能使用move_uploaded_file(),它会拒绝工作。