没有数据库的身份验证(PHP)


Authentication without database ( PHP )

如何在不使用任何类型的数据库的情况下安全地验证用户。

authenticate.php?username={$_GET['username']}&password={$_GET['password']}

if ($_GET['username'] == "secret_username" && password == "secret_password")
{
   $_SESSION['user'] = $username;
   header("Location: password_protected_page.php");
   exit;
}

这个方法似乎是一个选项。它安全吗?

使用文件保存数据。在公共HTML下面添加一个users.txt,如下所示:

username:hashedpassword

则使用fopen

<?php
    $filename = "/home/users.txt";
    $file = fopen( $filename, "r" );
    $display = fread( $file, filesize( $filename ) );
    fclose($file);
?>

然后以换行符和|展开,然后检查第一个是否等于username,第二个是否等于md5(password)。

我至少会张贴身份验证,但它应该工作良好。

当然可以。但是,只需使用POST。

这个过程没有任何问题。甚至当我们使用数据库时,我们实际上也做同样的事情,只是使用一些select命令。

您可能正在考虑密码散列,但使用它们是为了,即使第三方获得了数据库转储(以某种方式),他们也无法真正解密密码,因为散列是单向函数。现在在你的情况下,你不使用数据库,所以这不是一个问题。

然而,问题在于可伸缩性。您确定系统中总是只有一个用户吗?

我自学了PHP。我从未上过课,也没有导师。我在"获取"数据库调用时遇到了问题,因为与其他看起来很自然的PHP相比,它们看起来很复杂。我很久以前就开始用这个了。

你可以创建一个文本文件(username.php)在一个目录下的web服务器可访问的文件夹

(考虑权限!)

有/root/users文件夹中有(按用户名)

/root/users.Joe.php
/root/users/Juan.php
/root/users/Tim.php

Tim.php内容
<?php
$userpath='/var/www/html/users/Tim';
$password='Timspassword';
?>

现在当Tim登录时,我们有这样的代码:

<?php
include '/root/users/'.$_POST[username].'.php';
if ($password == $_POST['password']) 
{
$_SESSION['loggedin']='yes';
$_SESSION['expire']='<how much time you need?>';
}
?>

这样可以更容易地创建新用户。顺便说一句,我在每个用户文件夹中使用index.php,如果不以匹配文件夹名称的特定用户登录,它将做很少的事情。您还应该使用https。您也可以使用密码加密/解密这些用户密码。

说实话,数据库注入是一个真正的漏洞。每天都有黑客在我的网站上搜索数据库。没有人,所以他们走了。