文件上传:应该是什么文件保存到的名字吗?(File uploading : What should

2019-10-17 02:10发布

我将文件上传控件添加到我的ASP.NET 2.0的网页,使用户可以上传文件。 文件将被存储在服务器的文件夹中的名称作为用户的。 我想知道什么是保存到服务器时命名文件的最佳选择。 需要考虑安全性,性能,灵活性来处理文件等。如果我错过了什么,请引导我

选项我现在正在考虑:

  1. 具有相同的名称作为上传输入文件名
  2. 添加用户ID +随机数+文件名输入文件名
  3. 在几秒钟内创建随机数+当前时间并保存这个数字文件。 将有一个表来映射这个号码与用户上传

还要别的吗? 什么是最好的方法?

提前致谢

Answer 1:

永远不要使用文件名的用户输入。 不要使用用户名。 用户的用户ID,而不是(我假设你的用户有一个唯一的ID)。

切勿使用原来的文件名。 使用您的解决方案3号,加上用户ID而不是用户名。

为了您的信息,PHP,几年前有一个漏洞:一个可以加强与文件上传一个HTTP POST请求,并包含“../../anything.php”文件名,并且PHP _FILES数组,应该含有消毒的价值观,没有检测到这些类型的文件名,所以人们可以在文件系统中的任何位置写入文件。



Answer 2:

我会使用的组合

  • 用户身份
  • 一个随机生成的字符串(例如,GUID)

例如PDF文件名:23212-dd503cf8-a548-4584-a0a3-39dc8be618df.pdf

这样一来,因为他/她想要的用户可以上传尽可能多的文件,没有文件名冲突,你还可以到用户,只要看一眼文件名指出哪些文件属于。

我不认为有必要包括在文件名中的其他任何信息,因为上传时间/日期,这样可以从该文件的属性进行检索。

此外,你应该将文件存储在安全的位置 ,其中外部用户,如您的网站的访问者无法访问。 相反,你通过代理网页(您阅读从安全位置的文件,并传递给用户的数据)交付文件给他们。 对于这个解决方案,需要一个数据库来跟踪文件,它们的位置,等等。

这也使您能够控制哪些用户可以访问哪些通过您的代码文件。


更新:这里有一个如何与代理网页的解决方案可以实现的描述。

  1. 创建一个名为Web窗体GetFile.aspx
  2. GetFile.aspx需要命名一个查询参数fileid ,这是用来标识文件来获得。 例如:
      http://www.mypage.com/GetFile.aspx?fileid=100 
  3. 使用fileid参数来查找文件位置在数据库中,以便它可以读取和发送给用户。 在Web表单您使用Request.QueryString("fileid")获取文件ID,并在查询中,将是这个样子(SQL)使用它:
      SELECT FileLocation FROM UserFiles WHERE写到FileID = 100 
  4. 阅读使用文件System.IO.FileStream并输出其内容通过Response.Write 。 请记住,设置适当的内容类型使用Response.ContentType第一,让客户端浏览器能够正确地处理请求的文件(见这个职位上asp.forums.net和MDSN文章这也是在后称,这既讨论自动确定适当的内容类型)的方法。

如果您选择这种方法,可以很容易地以后实现自己的简单的安全或自定义操作,如确保用户登录到你的网站,你发送文件之前,或者用户只能访问文件,他们上传的自己,或记录哪些用户下载的文件等的可能性是无穷无尽;-)



Answer 3:

看看在System.IO.Path类 ,因为它有很多的,你可以利用有用的功能,如:

检查哪些字符是一个文件名无效:

System.IO.Path.GetInvalidPathChars();

得到一个随机文件名:

System.IO.Path.GetRandomFileName();

获得一个独特的,randome名在临时目录

System.IO.Path.GetTempFileName();


Answer 4:

我会去的选项#3。 表映射这些文件与用户提供其他用途的道路,它总是这样。 如果您使用的映射,附加的用户名或ID,以文件的唯一的好处是,如果你想调试问题。

我可能会使用GUID,而不是一个随机数,但无论是可行的。 在我看来,最重要的事情是

  1. 没有用户名作为文件名的一部分作为存储文件的任何部分
  2. 不要使用原始文件名存储的文件的任何部分
  3. 使用随机数或GUID,以确保没有重复的文件
  4. 添加一个用户ID文件将有助于手动调试问题


Answer 5:

还有更多的这比满足眼睛......我在想,你已经知道了!

你说的是什么样的文件? 如果他们是什么,甚至远程大或数量等,该组文件可能是大我马上会建议你增加一些灵活性,以你的方法。

  1. 创建一个存储根路径的各种文件存储(这可能是驱动器,UNC路径,什么都你的环境支持)的表。 它最初将在这一个项目,这将是你的第一个存储位置。 一个很好的属性,以保持与这个数据是多少空间可以存储在这里。
  2. 维护文件相关的数据表(ID {GUID},创建日期,外键路径数据,文件大小)
  3. 将文件写入到仍然有它的房间(查询存储在根目录所有文件的大小,并比较这根容量)根
  4. 写使用GUID为名称的文件(混淆了文件的文件系统)..可以在没有文件扩展名被写入,如果安全需要(敏感文件)
  5. 根据从根/年{}号开始它的创建日期/月{号} / {天数} /file.extension写入文件

有了这个自然到位的系统 - 即使你不会/并不需要它前面 - 你现在可以更容易地重新定位文件。 您可以更好地管理文件。 您可以更好地管理文件的集合。 等我以前用过这个系统,并发现它是非常灵活。 与被存储到文件系统,而是设法从数据库中能有点失控,一旦文件存储变得如此之大,需要的东西得到了一下周围移动的文件处理。 此外,至少在Windows的情况下...存储文件不计其数在一个目录通常不是一个好主意(通过其创建日期打破东西的原因)。

当你有高产量和大脚印只有真正需要这种复杂性。



文章来源: File uploading : What should be the name of the file to save to?