如何在PHP代码中安全地存储密码?

时间:2009-09-16 12:02:21

标签: php passwords

如何在PHP代码中输入密码,并保证浏览器中没有人查看该页面可以检索它?

是:<?php $password = 'password' ?>够了吗?有没有更好,更安全的方法呢?

11 个答案:

答案 0 :(得分:12)

取决于您要存储的密码的类型

  • 如果您想存储要比较的密码,例如拥有$users数组,然后进行散列是可行的方法。 sha1md5或任何其他风格(此处为概述)

    添加salt帐户以获得额外的安全性,因为相同的密码不会产生相同的哈希值

  • 如果要存储密码以连接到其他资源(如数据库):如果将密码存储在文档根目录之外,即浏览器无法访问,则最安全。如果不可能,您可以使用.htaccess文件拒绝来自外部的所有请求

答案 1 :(得分:6)

您的PHP代码将(baring配置错误)在服务器上处理。浏览器中不会显示<?php ?>;块内的任何内容。您应该确保您的部署服务器不会向客户端显示语法错误 - 即错误报告设置为不包括E_PARSE的内容,以免仓促编辑实时代码(承认它,我们都这样做:)泄露一些信息。< / p>

编辑:关于将它们存储在文档根目录外的文件中的观点,以避免在PHP配置中断时暴露无效。当我使用PHP时,我在运行时保留了htdocs之外的require d的config.inc文件,并导出了配置特定的变量(即密码)。

答案 2 :(得分:2)

有很多方法可以做到这一点。但是,人们将无法在PHP文件中查看您存储的密码(作为纯文本),因为PHP是服务器端语言,这意味着,只要您不将其打印到浏览器,它就会保持隐形。

所以这是'安全'。

答案 3 :(得分:2)

假设您的密码为“iamanuisance”。以下是如何在代码中存储密码。只需将它放在你的标题中。

//calculate the answer to the universe
${p()}=implode(null,array(chr(0150+floor(rand(define(chr(ord('i')+16),'m'),
2*define(chr(0x58),1)-0.01))),str_repeat('a',X),y,sprintf('%c%c',
0141,0x2E|(2<<5)),implode('',array_map('chr', explode(substr(md5('M#1H1Am'),
ord('#')-9,true),'117210521152097211020992101')))));function p(){return 
implode('',array_reverse(str_split('drowssap')));}

如果它不是完全明显,您可以稍后以$password轻松访问密码。干杯! :P

答案 4 :(得分:1)

存储加密的密码。例如,取输出:

sha1("secretpassword");

...并将其放入您的代码中。更好的是,将它放在数据库中或Web服务器目录树之外的文件中。

答案 5 :(得分:1)

基本,可能不是100%不透水但足以用于一般用途:

使用您喜欢的算法散列密码(使用salt以增加安全性),并存储散列(和盐)。比较盐渍和使用存储数据对输入进行哈希输入以检查密码。

答案 6 :(得分:1)

如果您可以在PHP中检索密码,那么它是可检索的......

您唯一能做的就是将密码移至“受保护”的位置。

大多数托管公司将提供一个单独的位置,您可以放置​​您的数据库文件等,并且无法通过浏览器访问此位置。你应该在那里存储密码。

但是他们仍然在你的服务器上,当有人访问你的盒子时,他就有了你的密码。 (他得到你的PHP有解码方式,他可以访问受保护的文件 - &gt;他可以阅读它)

所以没有“安全密码”这样的东西

您唯一的选择是不为您的用户存储密码等...如果我订阅了服务,我会生气,并且他们会通过电子邮件向我发送密码,以防我忘记密码。他们以“可检索的方式”存储它,这不是你应该做的事情。

这就是所有散列和腌制的地方。你想要非常有人能够访问资源。因此,您对密码进行哈希+加密,并将其存储在数据库中,以供希望访问该服务的用户使用,当用户想要进行身份验证时,您应用相同的算法来创建哈希值并进行比较。

答案 7 :(得分:0)

除非输出内容,否则客户端无法检索PHP代码块。观察:

<?php
   if($password=="abcd")
       echo "OK";
   else
       echo "Wrong.";
?>

用户可以获得正常或其他任何错误。

答案 8 :(得分:0)

我通常不相信原始PHP代码的服务密码。编写一个简单的PHP扩展来释放密码。这可以确保工作集无密码,这使得受感染的计算机可以向服务授予对黑客的访问权限。

答案 9 :(得分:0)

根据建议,存储密码sha1,盐渍和胡椒

function hashedPassword($plainPassword) {
    $salt = '1238765&';
    $pepper = 'anythingelse';    
    return sha1($salt . sha1($plainPassword . $pepper));
}

然后比较两个值

if ($stored === hashedPassword('my password')) {
   ...
}

如果您不能将哈希密码存储在服务器根目录之外,请记得在.htaccess文件中指示apache禁止访问该文件:

<Files passwords.config.ini>
  Order Deny,Allow
  Deny from all
</Files>

答案 10 :(得分:-1)

最好的方法是将密码存储在根目录之上。如果你决定在php文件中有密码,那么没有人能够查看,因为php文件在服务器中被执行。但是如果服务器不支持php,那么这些文件将作为文本文件传送,任何人都可以看到密码。