2013-06-03 172 views
0

我一直在寻找很长一段时间关于PHP的安全登录。我发现了一些有趣的内容,但我仍然不完全肯定最安全和简单的方法。用PHP安全登录

我创建了一个简单的系统,但我不确定它足够安全。我将保留这个简短的内容,以免让你不知道详细信息:

我在数据库中的用户表包含名为“loginToken”的列。当用户登录时,将创建一个值(,基于该用户的ID,一个随机数,最后sha1被散列),该值插入到数据库用户表的loginToken中。

除此之外,$ _CCOKIE创建时具有相同的值。因此,这些值每次都是给每个用户完全不同的,交替用户登录

我们检查用户登录,我用这个下面的代码:

$user_id = -1; //By default, the user is logged out 

if (isset($_SESSION["user"]) && isset($_COOKIE["ut"])) { //Check session and user token exists 
    //Get variables 
    $uid = $_SESSION["user"]; //Get user ID 
    $ut = $_COOKIE["ut"]; //Get user token 

    //Compare the user id with the user token in the database 
    $sql = mysql_query(" 
     SELECT COUNT(*) 
     FROM `users` 
     WHERE `id` = '$uid' AND `login_token` = '$ut' 
    "); 

    //Get result 
    $sql = mysql_result($sql, 0); 

    //Found! 
    if ($sql == 1) { 
     $user_id = $uid; //User logged in! 
    } 
} 

是这样理解的?如果是这样,那是一种足够安全的方法吗?

谢谢!

+1

这根本不安全。你不是在消毒你的信息,你信任客户端的一切。请至少使用准备好的语句。 –

+1

你需要看看mysqli和参数化查询http://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php – j0hnstew

+1

@RudiVisser:对不起,我对这个编码领域还比较陌生。什么是“准备好的陈述”? – Tom

回答

0

您的方法不安全。用户可以设置一个恶意cookie,可以在您的数据库上执行SQL注入。

使用会话变量。

if ($_SESSION['logged_in'] === true) { ... 

这是经常使用的方法。

通常您希望用户通过HTTPS安全表单输入用户名和密码。当您收到请求时,将用户名和存储在数据库中的密码的散列版本与表单提供的散列版本进行比较。如果哈希匹配,则设置$ _SESSION ['logged_in'] = true。

在后面的代码,检查会话变量,以确保在用户登录

+1

谢谢,但我想你误会了。我知道如何登录,但脚本用于每个页面的开头,以检查用户当前登录的任何地方。 编辑:而且由于会话只有持续有限的时间,我不能依赖会话。 – Tom

+1

会议可以实现永久持续。它们通过一个cookie来实现。您可以改变PHP对会话的处理方式,这对于为会话数据使用基于SQL的后端更加安全且更具可扩展性是很常见的。 – beiller

+1

哦,我没有意识到这一点。谢谢!用户可以通过任何方式操作会话来以另一个用户身份登录吗? – Tom

-1

使用以下命令来检查HTML特殊字符和SQL注入防护:

$uname=trim(htmlspecialchars($_POST['username'])) 

,并检查作为

if($uname!=""){ 
//continue with your database connection and checking. 
//do use of prepare statement than using mysql_query() refer the link for  
//sample code. 
} 
else{ 
echo "UserName should not be null"; 
} 

下面是用PHP安全的链接进行登录:http://www.codeslips.com/post/Login-script-in-PHP-data-checking-from-mysql-database