CGI脚本中的纯文本密码是安全漏洞吗?

时间:2010-12-01 15:34:57

标签: perl security cgi webserver cgi-bin

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

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

6 个答案:

答案 0 :(得分:10)

  

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

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

  

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

是。确切地说,只需确保目录在webroot之外。

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

  

我的脚本是用Perl btw编写的。

我会考虑使用其中一个Config::*模块。

答案 1 :(得分:3)

值得一提的一个问题是特定于共享托管。

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

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

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

有针对此的对策,但它们使用户的事情变得复杂,因此很多主机不会实现它们。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

此外,您可以将DB配置为仅接受来自本地套接字的连接,因此了解数据库密码将毫无用处。

答案 5 :(得分:0)

你已经得到了比我能提供的更好的答案,但作为一个注释:

将密码存储为明文,句号非常糟糕。

以同样的方式,在没有获得许可的情况下覆盖或删除文件的形式非常糟糕。如果你这样做,它最终咬你或你的客户。