在网页中使用登录功能时,验证输入数据的最佳做法是什么?Php登录 - 最佳实践
我不是在谈论大规模的用户,而只是一个管理员角色。该网页没有使用任何数据库,因此我不想仅为一个帐户添加功能。
目前我只是使用一个带有输入数据和硬编码密码的If语句,这不知何故感觉不安全,但同时用户无法看到php代码,只要他们没有得到到服务器,还是我错了?
if($password == 'myPassword123')
顺便说一句,有什么办法从服务器(从用户的角度)下载实际的.php文件。
在网页中使用登录功能时,验证输入数据的最佳做法是什么?Php登录 - 最佳实践
我不是在谈论大规模的用户,而只是一个管理员角色。该网页没有使用任何数据库,因此我不想仅为一个帐户添加功能。
目前我只是使用一个带有输入数据和硬编码密码的If语句,这不知何故感觉不安全,但同时用户无法看到php代码,只要他们没有得到到服务器,还是我错了?
if($password == 'myPassword123')
顺便说一句,有什么办法从服务器(从用户的角度)下载实际的.php文件。
哈希密码!从不以明文形式存储。
并且为了防止错误配置泄露您的密码而将密码存储在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!";
}
?>
在正常实践中,没有办法只是下载一份php文件的副本,而不会在服务器上出现错误或配置错误。
话虽这么说,你应该只存储密码的哈希值,而不是纯文本版本http://php.net/manual/en/faq.passwords.php
用户将可以访问你的PHP代码的唯一方法是,如果:
我会创建一个动态生成的字符串,并将其与我的密码进行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;
?>
我猜你想在使用$ _SESSION – Anigel
之前添加'session_start()',这只是我的意思的快速视图。 –
最好的做法是哈希你的密码! – mnagel