【发布时间】:2013-11-02 12:14:00
【问题描述】:
我对图像感兴趣,但问题很笼统。我正在做thusly:
private static final SecureRandom RANDOM = new SecureRandom();
private static final int FILENAMElENGTH = 73; // a guess
private static String nextId() { // synchronized ?
return new BigInteger(FILENAMElENGTH, RANDOM).toString(32);
} // https://stackoverflow.com/a/41156/281545
问题:
- 使用会话 id + 时间戳存储文件有优缺点吗? 稍后使用此信息中的优点和 安全性中的缺点
- 是否有任何标准(参见 servlet API 或 Java)生成名称的方法?有什么标准做法吗?任何容器特定提示(glassfish 和 tomcat)
我了解保留原始文件名、用户名等可能会导致安全漏洞
相关:
【问题讨论】:
-
这完全取决于您对这些名称所做的工作。如果您将图像公开并包含用户的会话 ID,那么显然任何人都可以获取另一个用户的会话 ID 并冒充他。您可以简单地使用数据库序列,和/或对文件内容进行散列以生成唯一名称。随机也很好,除了它是随机的,因此不能提供唯一性的有力保证。
-
@JBNizet:有什么标准做法吗?像 api 中的方法?什么是 db 序列 ?我的用途是保存图片,然后通过
<img src="${sessionScope.photo.path}" />事物显示它(确实显示会话 - 哎呀!) -
一个 db 序列是一个数据库序列。数据库序列就像一个计数器,但它是持久的,可以由多个线程甚至应用程序共享,并且即使您关闭并重新启动应用程序,也会在最后一个值处重新启动。您向数据库询问下一个值,它会返回它。它通常用于生成主键值。不,没有单一的标准做法可以做你想做的事。
-
@JBNizet:您能否发布一些代码来获取这样的序列 - 比如说 JDBC/MySQL(在答案中:)
-
不幸的是,MySQL 没有序列。不过,您可以使用 auto_increment 列来模拟它们。 Google 是你的朋友:“MySQL 序列”。
标签: servlets file-upload tomcat7 glassfish-3 servlet-3.0