【问题标题】:How to generate random file name for socket under Linux?Linux下如何为socket生成随机文件名?
【发布时间】:2009-11-09 05:36:38
【问题描述】:

我想制作一个使用本地命名空间套接字的小程序,我需要使用临时文件名作为套接字的地址。

那么Linux下如何生成随机文件名呢?

+ 我在 Debian Linux 下使用 C 编程语言。
+ 根据 GNU C 库参考,tmpname 不安全。但是安全的 tmpfile 和 mkstemp createopen 生成的文件。有没有 safe 和 non-create-open 对此。换句话说,该函数应该禁止任何其他请求在特定目录下创建生成的文件名。

谢谢。

【问题讨论】:

    标签: c linux sockets random


    【解决方案1】:

    如果您在 C 中执行此操作,请使用 mkdtemp 创建一个目录,并将您的套接字放入该目录中。

    tmpnammktemp 等其他函数是不安全的;由于他们不会为您创建和打开临时文件,因此很容易受到遵循预先存在的符号链接(由猜测您的临时文件名的攻击者放置)到某个重要文件(如/etc/passwd)的攻击,覆盖它.

    请注意,没有办法“锁定”路径 - 你所能做的就是在那里创建 一些东西。如果您最终需要在那里放置一个套接字,最好使用目录作为占位符。

    【讨论】:

    • 您不应该在没有权限或 ACL 保护的目录中创建重要文件。您对攻击者可以符号链接您尝试创建的文件的评论是无关紧要的,除非您尝试在不安全的区域中创建它(在这种情况下,您应该得到一切)。
    • 如果您安全地创建目录或文件,/tmp 就足够安全了——也就是说,使用O_EXCL|O_NOFOLLOW 创建文件,以及一个可以防止其他用户访问该文件的 umask,准备好如果失败,请使用不同的文件名重试。 mkdtemp() 为您解决这个问题。因此,在不了解运行时环境的情况下,这是您可以获得的最安全的方法。
    【解决方案2】:

    mktemp 程序是 GNU coreutils 的一部分。 See it's manpage for details.

    典型用法就这么简单:

    TEMPDIR=$(mktemp -d)
    echo $TEMPDIR
    touch $TEMPDIR/yourfile.txt
    

    (如 in other answer 所述,只有创建目录才是安全的。)

    【讨论】:

      【解决方案3】:

      您没有指定您使用的语言,但假设它是 C/C++ 方言(或其他可以访问 C 运行时库的语言),您可以使用 tmpnam 函数。

      tmpnam 存在一些问题,其中最严重的可能是在您使用它创建文件之前,您返回的临时文件名实际上并未“锁定”,因此理论上其他一些进程可以创建该文件从你下面出来。您还必须绝对确保您传递 tmpnam 的缓冲区有足够的空间来容纳您的操作系统可以支持的最长路径。

      现在建议您致电tmpfile。这将在一个(希望是原子的)操作中为您创建文件,并为您返回文件句柄。另一个不错的好处是,当您关闭该文件时,它会自动为您删除。没有麻烦,没有大惊小怪。

      【讨论】:

      • tmpfile 返回 FILE *,而不是路径 - 当 OP 想要打开 unix 域套接字时帮助不大。
      【解决方案4】:

      玩 /dev/random。

      在谷歌上的快速搜索给了我这个命中:

      < /dev/urandom tr -dc A-Za-z0-9 | head -c8

      如果你想在 C 中做同样的事情, 只需打开 /dev/random 并将其转换为字符串(忽略无效字符)。

      【讨论】:

        猜你喜欢
        • 2014-11-09
        • 2021-12-06
        • 1970-01-01
        • 2021-05-15
        • 1970-01-01
        • 1970-01-01
        • 2016-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多