2013-07-15 186 views
1

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

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

目前我只是使用一个带有输入数据和硬编码密码的If语句,这不知何故感觉不安全,但同时用户无法看到php代码,只要他们没有得到到服务器,还是我错了?

if($password == 'myPassword123') 

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

+5

最好的做法是哈希你的密码! – mnagel

回答

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!"; 
} 
?> 
5

在正常实践中,没有办法只是下载一份php文件的副本,而不会在服务器上出现错误或配置错误。

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

0

用户将可以访问你的PHP代码的唯一方法是,如果:

  1. 他们侵入你的服务器,在这一点上,他们发现你的管理员密码是你最担心的问题。
  2. 服务器错误配置会将PHP代码以纯文本格式转出(几年前发生在Facebook)。
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; 
?> 
+0

我猜你想在使用$ _SESSION – Anigel

+0

之前添加'session_start()',这只是我的意思的快速视图。 –