关于php:如何将crypt()哈希转换为文件名?

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,它还包括编码类型。

1
$1$rasmusle$

这里是编码类型。(本例中为MD5)

1
$1$

最后是散列值。

1
rISCgZzpwk3UhDidwX/in0

文件名中不能有正斜杠,因为这将被解释为文件夹。

我应该简单地删除所有的正斜杠,并且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');


    始终规范化用户提供的数据,包括文件名,除非您希望通过上载包含NULL的文件来愚弄php而受到黑客攻击。指定允许的字符(即a-za-z0-9),并将所有其他字符转换为下划线。或者使用sha1/md5从文件名创建哈希并将文件存储在该名称下。

    编辑

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

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


    在哈希上运行urlencode方法,它应该用%2f替换所有的"/"…我知道这不是一个完美的修复方法,因为我认为Apache服务器之类的东西仍然会阻止URL中包含"%2f"的任何Web请求。这件事我只有2美分


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

    您只需使用md5md5_file/sha1sha1_file函数即可创建哈希,而不需要这些附加信息。除非你想同时使用不同的算法。