【问题标题】:Is a plain-text password in a CGI script a security hole?CGI 脚本中的纯文本密码是安全漏洞吗?
【发布时间】:2011-05-18 13:56:22
【问题描述】:

我了解到您的 Web 服务器可能出现问题,这可能导致 PHP 脚本在 Web 浏览器中显示为纯文本文件;因此,我已将大部分 PHP 脚本移至 Web 根目录之外的目录。现在我一直想知道我的 cgi-bin 中的 CGI 脚本是否会发生同样的情况。

我主要关心的是一个脚本,其中包含我的 MySQL 数据库的用户名和密码。如果这是一个可能的安全漏洞(至少就数据库内容而言),是否有办法将敏感数据放在不同的位置并从那里获取(比如将其保存在不同目录中的文件中并读取例如,它来自该文件)?顺便说一句,我的脚本是用 Perl 编写的。

【问题讨论】:

    标签: perl security cgi webserver cgi-bin


    【解决方案1】:

    你已经得到了比我能提供的更好的答案,但请注意:

    将密码存储为明文、句号是非常糟糕的形式。

    同样,在未经许可的情况下覆盖或删除文件是非常糟糕的形式。如果你这样做,它最终咬你或你的客户。

    【讨论】:

      【解决方案2】:

      我了解到您的 Web 服务器可能出现问题,这可能导致 PHP 脚本在 Web 浏览器中显示为纯文本文件;因此,我已将大部分 PHP 脚本移至 Web 根目录之外的目录。现在我一直想知道我的 cgi-bin 中的 CGI 脚本是否会发生同样的情况。

      是的。如果出现问题导致程序被服务而不是执行,那么它们的任何内容都将被暴露。这与 PHP 的问题完全相同(除了考虑到 cgi-bin 目录通常配置的方式(即别名到 Web 根目录 外部 的目录)),问题稍微难一些发生)。

      我主要关心的是一个脚本,其中包含我的 MySQL 数据库的用户名和密码。如果这是一个可能的安全漏洞(至少就数据库内容而言),是否有办法将敏感数据放在不同的位置并从那里获取(比如将其保存在不同目录中的文件中并读取例如,它来自那个文件)?

      是的。就是这样,只要确保目录在 webroot 之外。

      为了提高安全性,请确保数据库仅接受来自需要访问它的最少主机集的连接凭据。例如如果数据库与 Web 服务器位于同一台服务器上,则仅让凭据适用于 localhost。在这种情况下,使数据库仅侦听 localhost 网络接口也是一个好主意。

      顺便说一句,我的脚本是用 Perl 编写的。

      我会考虑为此使用Config::* 模块之一。

      【讨论】:

      • Dorward 感谢您提供有用的信息!
      【解决方案3】:

      值得一提的是共享主机。

      如果您在与其他用户共享的主机上,则可能无法向他们隐藏密码。 这取决于操作系统和网络服务器的配置细节。

      例如,Linux 上的 Apache 配置很常见,在该配置上,用户提供网站以使文件对网络服务器用户可读或可写的唯一方法是使它们对所有可读/可写/em> 用户。

      您可以相信所有这些用户自己不会滥用此功能,但如果其中一个网站存在允许入侵者查看完整文件系统的漏洞,那么入侵者就可以在所有其他网站上利用该漏洞。

      对此有应对措施,但它们使用户的事情变得复杂,因此许多托管商没有实施。

      【讨论】:

        【解决方案4】:

        如果可以避免的话,在脚本中硬编码密码绝对不是一个好主意。幸运的是,Postgres 和 MySQL 都支持从文件加载数据库凭据。对于 Postgres,你使用 ~/.pgpass,对于 MySQL,我相信它是 ~/.my.cnf。在任何一种情况下,您都将调整权限,以便只有运行脚本的用户才有读取文件的权限。这种方法的优点是您不必编写代码来读取文件 - DB 客户端库会自动完成。

        【讨论】:

          【解决方案5】:

          如果您使用配置为 cgi-bin 的目录,则无法显示文件,除非 Apache 配置出错。如果您在 cgi-bin 目录之外但在站点根目录内使用 Perl 程序,则可能会发生这种情况。

          另外,您可以将 DB 配置为仅接受来自本地套接字的连接,因此知道 DB 密码将毫无用处。

          【讨论】:

            【解决方案6】:

            这绝对是一个安全问题。您应该将加密的密码存储在单独的文件中,并确保只有您的应用可以访问它。

            【讨论】:

            • 存储密码加密不会有太大帮助,因为解密它的密钥也必须可用。根据经验,检查密码是否正确的系统应该只存储密码的哈希值——但这不适用于需要提供密码的系统。
            • 加密是一个额外的安全步骤。这就像你的汽车警报器。它不会阻止一个真正优秀的小偷,但会帮助劝阻一个平庸的小偷。
            • 在这种情况下,大多数小偷可能会认为破解加密是一个有趣的挑战。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-04-01
            • 2017-04-12
            • 2014-09-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多