How do you convert crypt() hashes for use as file names?
我使用的是crypt(),在特定情况下,它使用一个带有12个字符salt的MD5哈希。
下面是一个从php.net,crypt文档中修改的字符串crypt()返回的示例。
1
| $1$rasmusle$rISCgZzpwk3UhDidwX/in0 |
这里是salt,它还包括编码类型。
号
这里是编码类型。(本例中为MD5)
最后是散列值。
。
文件名中不能有正斜杠,因为这将被解释为文件夹。
我应该简单地删除所有的正斜杠,并且crypt()使用的字符集还有其他问题吗?
您似乎希望阻止/允许特定用户访问映像。如果是这样的话,我会做以下事情:
将图像存储在文档根目录之外。这样可以确保图像不能被直接请求。
将图像的原始名称存储在数据库中,并将sha1_file()散列存储在同一记录中。如果服务器上没有重复的图像,这会增加好处。虽然图像很小,但它可以防止系统混乱。
当有人请求一个"私有"图像时,他们会通过一个PHP文件来请求它,该文件将检查用户是否有访问该文件的权限,以及是否有权(从数据库)访问该文件。
使用上述方法,您将对谁可以请求图像拥有最大的控制权,您的用户将为此感谢您。
注意:不能简单地将所有图像存储在同一个文件夹中,因为所有文件系统都限制了在一个目录中可以存储多少文件。
为图像提供服务的PHP脚本的简单示例如下所示:
1 2 3 4 5
| <?php
// always set the header and change it according to the type of the image
header("Content-type: image/jpeg");
echo file_get_contents('/path/to/the/image.jpg'); |
号
- 现在的限制很高
- @webnetmobile.com是的。
- 因为我读到的时候,你希望文件不公开。你所说的是通过默默无闻来保证安全。
- 不,这和你散列密码的原因不一样。密码散列可能会落入攻击者手中。在这种情况下,他们唯一知道的是散列值,而不是密码本身。如果攻击者获得图像散列,他/她将拥有图像本身,而不仅仅是散列。
- 好极了……
始终规范化用户提供的数据,包括文件名,除非您希望通过上载包含NULL的文件来愚弄php而受到黑客攻击。指定允许的字符(即a-za-z0-9),并将所有其他字符转换为下划线。或者使用sha1/md5从文件名创建哈希并将文件存储在该名称下。
编辑
这将用下划线_替换除a-z、a-z、0-9之外的所有字符:
1
| $normalizedName = preg_replace('/[^A-Za-z0-9]/', '_', $userProvidedName); |
- 查看已编辑的答案
- 我怀疑你"不使用文件名"。例如,您可以使用它们让您的用户下载该文件。这足以引起注意,并且不会让您的用户被种植的入侵,即.scr看起来像.jpg。
- 好啊。那么你似乎在一个更安全的地方,至少是这样:)
- 残存物。远离的。
- 那你到底有什么问题?哈希不包含正向slase。只是字母数字
- 不,那是胡说八道。MD5是128位散列,通常显示为十六进制字符串。
- 确切地。我的意思是散列函数结果是一回事(在本例中,它返回128位散列),散列的表示是另一回事(大多数实现将散列返回为基于32个十六进制的字符串)。
- 所以内存中存储了128位,您如何表示文本中的不相关,不管它是二进制、八进制、十六进制还是crypt()使用的字符集。
在哈希上运行urlencode方法,它应该用%2f替换所有的"/"…我知道这不是一个完美的修复方法,因为我认为Apache服务器之类的东西仍然会阻止URL中包含"%2f"的任何Web请求。这件事我只有2美分
/$1$/-是用于创建哈希的算法
您只需使用md5md5_file/sha1sha1_file函数即可创建哈希,而不需要这些附加信息。除非你想同时使用不同的算法。
- 听起来你用错误的工具来解决问题。如果内容是公开的,谁在乎有人能猜到。如果不是,您无论如何都需要在它上面有一个ACL层。我会用sha1来避免碰撞,这已经足够了。我也会把它分成文件夹,比如5-10个符号。
- 永远不要解决不存在的问题。它是永不发布产品的方法之一。
- 另一方面,现在每次访问该文件时,您都需要找出(知道)算法。如果你只是掷硬币和选择一个,这将使你的生活方式更容易,因为算法总是一样的。