在php变量或php常量中以明文形式存储密码是否可以?

时间:2009-02-20 08:02:29

标签: php security passwords

根据问题,将密码存储在诸如

之类的php页面上是否安全
$password = 'pa$$w0rd';

如果用户看不到它,那就安全了吧?

编辑: 有些人实际上建议使用hash,但是,数据库服务器连接密码会出现问题,不是吗?

8 个答案:

答案 0 :(得分:34)

简短的回答既不是,也取决于。

以纯文本形式存储密码几乎绝不是一个好主意,特别是在可访问Web的位置,如果因为其他原因而不是简单的服务器配置错误或错误的地方的回显可能会暴露它走向世界。

如果您必须存储密码(可能),您可以尝试将其存储在webroot之外,例如 /var/www/public_html/将您的代码放在这里 /var/www/includes/将您的密码放在这里

比这更好的是让你需要密码的系统(例如数据库包装器)返回已经实例化的对象。所以,而不是要求$databasepassword你要求一个PDO对象,并将你的数据库类存储在webroot之外。

It Depends来自哪些攻击媒介会导致某人有权访问该密码文本,并且它是否需要它们已经在您的文件系统中,如果是这样,您可能无论如何都被搞砸了。

另外,如果它是你的supa-secrit订阅者内容的密码,嗯,你丢失的只是一些订阅费,如果你的数据库,你可能有问题,如果这是你的网上银行细节,嗯好您。

密码保护的价值有多大?

答案 1 :(得分:9)

根据您如何定义安全,任何方法都有其积极和消极的方面。

如果您真的想在源代码中存储密码,那么做一些类似的事情可能是个好主意:

文件: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 )
...

纯文本永远不是一个好主意,总是存储您要存储的密码的哈希值。

此外,尝试从主源文件中分离出这样的定义。

答案 2 :(得分:7)

通常他们看不到它。但是如果在服务器上发生了不好的事情,服务器很可能会以纯文本形式返回你的php代码而不执行它,因此用户将看到该文件的所有来源以及你的密码。

我会将密码存储在文档根目录(不能在浏览器中打开)的某个地方,然后用php打开该文件并读取内容(密码)。或者,如果您有多个密码/用户,我会将它们存储在数据库中以便快速访问。

如果要使用文件方法,目录布局应该类似于此(服务器上的depneds)

  

/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

答案 3 :(得分:2)

只要您的PHP安装正常工作,这就不会比任何其他方法更安全。我宁愿命名常量(define)而不是变量。另外,您可以考虑存储密码的哈希值,而不是普通密码。即使网站遭到入侵,这也可以防止窃取您的密码。

至于不好的做法,这取决于。如果您只需要存储一个密码,这种方法就可以了。将它们存储在文档根目录之外可能会产生额外安全性的错误感觉;文档根目录不比服务器的任何其他设置更绝对。

答案 4 :(得分:0)

除非网站本身受到损害,否则这些密码授予访问权的所有内容(也许是您的数据库?)。

答案 5 :(得分:0)

这取决于你如何定义'安全'。

你是对的,一般用户不会看到它。

然而,这绝对是一种不好的做法;如果您的网站遭到入侵,这些密码还可以访问哪些内容?我要说的是,你应该存储密码的哈希,而不是明文。

答案 6 :(得分:0)

有时它必须是f.e.对于一个邮件应用程序,您只能使用普通密码登录而不能使用哈希。如果您的应用程序没有安全问题,则不应影响您。

答案 7 :(得分:0)

我相信大部分时间纯文本密码都是MySQL的数据库密码,例如,不接受哈希进行身份验证。

如前所述,最佳解决方案是将PHP配置文件保留在webroot之外的密码。

如果您担心有人在查看文件时可能会看到您的密码,您可以使用base64功能简单地让人无法阅读。

有关详细信息,请参阅this post,有关Windows,Linux和Mac的详细信息,请参阅更轻松。