如何将crypt()哈希转换为文件名?

时间:2012-11-26 21:46:02

标签: php hash

我正在使用crypt(),在特定情况下使用带有12个字符salt的md5哈希。

以下是从php.net,crypt文档修改的字符串crypt()返回的示例。

$1$rasmusle$rISCgZzpwk3UhDidwX/in0

这是盐,它还包括编码类型。

$1$rasmusle$ 

这是编码类型。 (在这种情况下为MD5)

$1$ 

最后是哈希值。

rISCgZzpwk3UhDidwX/in0

您不能在文件名中包含正斜杠,因为这会被解释为文件夹。

我应该简单地删除所有正斜杠,还有crypt()使用的字符集的其他问题。

4 个答案:

答案 0 :(得分:5)

您希望阻止/允许特定用户访问该图像。如果是这种情况,我会做以下事情:

  1. 将图像存储在文档根目录之外。这样可以确保不能直接请求图像。
  2. 将图像原始名称存储在数据库中,并将sha1_file()哈希存储在同一记录中。如果您的服务器上没有重复的图像,这会增加好处。虽然图像很小,但可以防止系统混乱。
  3. 当某人请求“私人”图像时,他们将通过PHP文件请求它,该文件将检查用户是否具有访问该文件的权限,如果是,则提供文件(来自数据库)。
  4. 使用上述方法,您可以最大程度地控制谁可以请求图像,您的用户将会感谢您。

    注意:您不能简单地将所有图像存储在同一文件夹中,因为所有文件系统都有limits as to how many files can be stored in a single directory

    提供图像的PHP脚本的简单示例如下所示:

    <?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');
    

答案 1 :(得分:1)

/ $ 1 $ / - 是用于创建哈希的算法

您可以使用md5 md5_file / sha1 sha1_file函数创建哈希,而无需其他信息。除非你想同时使用不同的算法。

答案 2 :(得分:1)

在哈希上运行URLEncode方法,它应该替换所有&#39; /&#39;使用%2F ...我知道这不是一个完美的解决方案,因为我认为像apache服务器这样的东西仍会阻止任何网页请求与&#39;%2F&#39;在网址中。这件事只需2美分

答案 3 :(得分:1)

始终规范化用户提供的数据,包括文件名,除非您希望通过上传名称包含NULL的文件来愚弄PHP。指定允许的字符(即A-Za-z0-9并将所有其他字符转换为下划线。或者使用sha1 / md5从文件名创建哈希并以该名称存储文件。

修改

这将使用下划线_替换除A-Z,a-z,0-9之外的所有字符:

$normalizedName = preg_replace('/[^A-Za-z0-9]/', '_', $userProvidedName);