将密码以纯文本形式存储在 php 变量或 php 常量中是不是可以?
Posted
技术标签:
【中文标题】将密码以纯文本形式存储在 php 变量或 php 常量中是不是可以?【英文标题】:Is it ever ok to store password in plain text in a php variable or php constant?将密码以纯文本形式存储在 php 变量或 php 常量中是否可以? 【发布时间】:2010-10-08 19:02:39 【问题描述】:根据问题,在 php 页面上存储密码是否安全,例如
$password = 'pa$$w0rd';
如果用户看不到,那是安全的,对吧?
编辑: 确实有人建议使用hash,但是,数据库服务器连接密码会有问题,不是吗?
【问题讨论】:
【参考方案1】:我相信大多数时候纯文本密码将是数据库密码,例如 mysql,不会接受哈希进行身份验证。
如前所述,最好的解决方案是将带有密码的 PHP 配置文件保存在 webroot 之外。
如果您担心有人会在您查看文件时看到您的密码,您可以简单地使用 base64 函数使其对人类不可读。
请参阅this post 了解详细信息,甚至可以使用适用于 Windows、Linux 和 Mac 的小型实用程序来简化操作。
【讨论】:
【参考方案2】:有时它必须是 f.e.对于邮件应用程序,您只能使用普通密码而不是哈希登录。如果您的应用程序没有安全问题,它应该不会影响您。
【讨论】:
【参考方案3】:根据您对安全的定义,任何方法都有其积极和消极方面。
如果您真的想在源中存储密码,那么做这样的事情可能是个好主意:
文件:config.php
if( ! defined('IN_CODE') ) die( 'Hacking attempt' );
define( 'PASSWORD_HASH', '098f6bcd4621d373cade4e832627b4f6' );
文件:index.php
define( 'IN_CODE', '1' );
include( 'passwd.php' );
if( md5($password) == PASSWORD_HASH )
...
纯文本永远不是一个好主意,始终存储您要存储的密码的哈希值。
此外,尝试将这样的定义与您的主源文件分开。
【讨论】:
【参考方案4】:通常他们看不到它。但是,如果服务器上发生了不好的事情,服务器很有可能会以纯文本形式返回您的 php 代码而不执行它,因此用户将看到该文件的所有来源以及您的密码。
我会将密码存储在不在文档根目录上的某个位置(无法在浏览器中打开),然后用 php 打开该文件并读取内容(密码)。或者,如果您有多个密码/用户,我会将它们存储在数据库中以便快速访问。
如果你想使用文件方法目录布局应该是这样的(取决于服务器)
/public_html/index.php
/password.txt
$myFile = $_SERVER['DOCUMENT_ROOT'] + "/../password.txt";
if file_exists($myFile)
$fh = fopen($myFile, 'r');
$password = fgets($fh);
fclose($fh);
else die("No password file");
if ($user_input == $password)
...... Authentication succeeded ..........
......your relatively protected code .....
else die("Wrong password");
如果您想要更高的安全性,而不是将密码作为文本存储在该文本文件中。痛它是哈希,然后当您想将其与用户输入进行比较时,从用户输入生成哈希并将其与您从文本文件加载的密码哈希进行比较
sha1($user_input) == $password_from_txt
【讨论】:
哇,我忘了我回答了 PHP 问题。近 6 年后看到没有评论的反对票仍然很有趣。另外,天啊,那时的世界是如此不同。【参考方案5】:简短的回答是不,这取决于。
以纯文本形式存储密码几乎从来都不是一个好主意,尤其是在网络可访问的位置,如果出于没有其他原因,而不是简单的服务器配置错误或错误位置的回显可能会暴露密码走向世界。
如果您必须存储密码,(这是可能的)您可以尝试将其存储在 webroot 之外,例如
/var/www/public_html/
把你的密码放在这里/var/www/includes/
把你的密码放在这里
比这更好的是让您需要密码的系统(例如数据库包装器)返回一个已经实例化的对象。因此,与其要求$databasepassword
,不如要求一个 PDO 对象,并将您的数据库类存储在 webroot 之外。
It Depends 来自于哪些攻击向量会导致某人访问该密码文本,并且是否要求他们已经在您的文件系统中,如果是这样,那么您可能还是被搞砸了。
另外,如果是你的 supa-secrit 订阅者内容的密码,嗯,你失去的只是一些订阅费用,如果是你的数据库,你可能有问题,如果是你的网上银行详细信息,嗯你。
密码保护的东西有多大价值?
【讨论】:
不会在对数据库服务器进行身份验证期间,通过 tcp/ip 发送明文密码? 大多数共享主机只有在环回上运行的本地数据库,所以那里不是真正的问题。此外,如果您不在共享主机上,则可能无需担心重新文件系统访问等安全问题。 尽管强烈建议不要在多个站点上使用相同的密码,但很多人还是会这样做。如果您的用户密码被泄露,他们的安全/隐私也可能在其他应用程序中受到损害。【参考方案6】:只要您的 PHP 安装工作正常,这并不比任何其他方法安全。我更喜欢命名常量(定义)而不是变量。此外,您可能会考虑存储密码的哈希值,而不是普通密码。即使网站遭到入侵,这也可以防止窃取您的密码。
至于不好的做法,这取决于。如果您只需要存储一个密码,这种方法就可以了。将它们存储在文档根目录之外可能会给人一种额外的安全感;文档根目录并不比服务器的任何其他设置更绝对。
【讨论】:
我见过一些网站以纯文本形式输出 php 源代码。如果发生这种情况并且文件位于文档根目录之外,即使每个人都知道文件的来源,他们也不能“简单地”从浏览器访问它。 我确实理解将内容存储在 docroot 之外的想法,也许它会增加一些安全性,但我认为它被高估了。如果该站点转储了 php 源代码,则该站点已严重损坏。如果它被破坏了,docroot 也可能不是我们希望的——例如 / 在 webroot 之外存储东西并不是万能的,你不能随便打印变量。但它确实给了你一个分离,你可以在你的代码中强制执行,类和初始化放在 webroot 之外,演示代码放在 webroot 里面。【参考方案7】:这取决于你如何定义“安全”。
你是对的,一般用户不会看到它。
但这绝对是一种不好的做法;如果您的网站遭到入侵,这些密码还能访问哪些内容?我会说您至少应该存储密码的哈希值,而不是明文。
【讨论】:
如果你只有密码的哈希值,你如何连接到数据库? 是的 - 如果密码用于数据库连接(OP 没有说明它是),那么这很棘手【参考方案8】:除非网站本身受到威胁,而且现在这些密码授予访问权限的所有东西(也许是您的数据库?)也是如此。
【讨论】:
以上是关于将密码以纯文本形式存储在 php 变量或 php 常量中是不是可以?的主要内容,如果未能解决你的问题,请参考以下文章