是否可能&;确定在通过HTML/PHP上载文件时使用rename()而不是move_uploaded_file()

是否可能&;确定在通过HTML/PHP上载文件时使用rename()而不是move_uploaded_file(),php,html,file-upload,Php,Html,File Upload,我想知道是否可以使用重命名功能代替移动上传的文件。有什么安全问题吗 原因是我正在构建一个File类,该类将处理所有文件上传和文件对象。我希望在不上传时能够在目录之间移动文件,我希望有一个名为move的1函数来实现这一点,我正在讨论是否应该在该函数中使用move\u uploading\u file或重命名。主要区别在于move\u uploaded\u file()仅适用于上传的文件 引述: 此函数检查以确保文件名指定的文件 是一个有效的上传文件(意味着它是通过PHP的HTTP上传的) 上传后机

我想知道是否可以使用
重命名
功能代替
移动上传的文件
。有什么安全问题吗


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

主要区别在于
move\u uploaded\u file()
仅适用于上传的文件

引述:

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

如果有任何可能 对上传的文件所做的任何操作都可能会将其内容泄露给用户 用户,甚至是同一系统上的其他用户

因此,这是一种安全检查,以确保有人不会试图读取您的
mysql.php
文件或其他可疑的伎俩

至于功能,它们是等效的-除了
move\u uploaded\u 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(),该怎么办?不太可能,但最好还是把事情做好以防万一。

他可以将这些检查添加到他的通用移动类中。有人能给出实际发生的情况和方式的确切示例吗?事实上,文档引用看起来很严肃——但在现实生活中,有没有任何可以利用它的例子?不确定它是如何发生的,但用户输入总是危险的。如果用户设法诱使您将其他文件移动到某个位置,然后将其显示,这是一个安全风险。@可能工作:“如果用户设法诱使您将其他文件移动到某个位置”-如何?上传文件的路径由php生成。它不受用户输入的任何影响。我们信任会话(也由php管理)。这有什么不同?老实说,虫族不知道。假设您从
$\u FILES[“…]”[“tmp\u name”]…
移动到其他地方,如果改用
重命名
,则不会有任何伤害。您不能只向move函数添加一个(n可选)参数,告诉它是temp文件夹中的常规文件还是上载文件,然后使用if语句调用相应的函数?那会聪明得多。@developerjk
不能
可以
?我也这么认为,所以我投了赞成票。我也可以在我的课堂上检查大小和类型,但谢谢你的回答。是的,我想使用重命名,因为它不是真正处理上传文件只有在少数情况下。这是有意义的,似乎最好的方法是添加参数,并做到这两个。我不会做任何事情,将上传的文件放在任何地方,我不希望它被放置,但我写了一个通用类,所以它并不总是我会使用它。