Php登录 - 最佳实践

时间:2013-07-15 09:59:18

标签: php security login account

在网页中使用登录功能i时,验证输入数据的最佳做法是什么?

我不是在谈论大规模的用户,而只是一个管理员角色。该网页没有使用任何数据库,因此我不想仅为一个帐户包含funtionallity。

目前我只使用带有输入数据和硬编码密码的If语句,这在某种程度上感觉不安全但同时用户无法看到php代码,只要他们没有到达服务器,还是我错了?

if($password == 'myPassword123')

顺便说一下,有没有办法从服务器下载实际的.php文件(从用户的角度来看)。

4 个答案:

答案 0 :(得分:5)

在正常情况下,如果服务器上没有错误或配置错误,就无法下载php文件的副本。

话虽这么说,你应该只存储密码的哈希而不是纯文本版本http://php.net/manual/en/faq.passwords.php

答案 1 :(得分:0)

用户访问PHP代码的唯一方法是:

  1. 他们入侵了您的服务器,此时,他们发现您的管理员密码是您最不担心的。
  2. 服务器错误配置以纯文本形式转储PHP代码(几年前发生在Facebook上)。

答案 2 :(得分:0)

我会创建一个动态生成的字符串并使用我的密码对其进行AND操作,并可能执行捕获尝试次数等操作。锁定用户直到会话到期。 :d

<?php //login.php
$_SESSION['xrf'] = hash('sha512');
$myPassword = 'password';
?>

<input type="hidden" name="_xrf_" />
<input type="password" name="password" />

<?php
$password = $_POST['password'];
if(isset($password) && $_SESSION['attempt'] != 3):
  $xrf = $_POST['_xrf_'];
  if($password === $myPassword  && $_SESSION['xrf'] === $xrf):
    echo 'Hell Yeah';
  else:
    header("Cache-Control: private, must-revalidate, max-age=0");
    header("Pragma: no-cache");
    header("Expires: Sat, 27 Jan 1997 05:00:00 GMT");
    header("Location:login.php");
  endif;
else:
  $_SESSION['attempt'] += 1;
endif;
?>

答案 3 :(得分:0)

哈希密码!永远不要以明文存储。

要防止错误配置泄露您的密码,请将密码存储在Web根目录之外,这样如果PHP要泄露您的代码,那么客户端/攻击者就无法访问实际的哈希/文件。这是一个使用简单用户函数中的crypt()函数来检查传递的简单示例。

<?php
function check_pass($password){
    $chkpass = file_get_contents(dirname(__FILE__).'/../path_outside/webroot/adminpass.txt');
    if(crypt($password, $chkpass) == $chkpass){
        return true;
    }else{
        return false;
    }
}

/* The file adminpass.txt contains the hash 
   $1$MH0.l.1.$aNx9btlqPfGpkAxK4Bdym. 
   which is mypassword in plaintext */
if (check_pass($_POST['password'])) {
   echo "ok!";
}else{
    echo "fail!";
}
?>
相关问题