从电子邮件链接和PHP自动登录?

时间:2013-07-21 17:12:00

标签: php security

我正在尝试创建一个链接,点击后会自动登录用户并将其带到特定页面。

我已经考虑过创建某种散列字符串,其中包含用户的ID,用户名和其他一些信息。单击时,将在数据库中查找这些信息,如果已经过验证,我将其登录并将其重定向到特定页面。

对于Twitter和Facebook等网站,当我收到电子邮件通知并点击我的电子邮件中的链接时,我会自动进入相应网站的收件箱。我正试图复制那种行为......

在做这样的事情时是否存在任何安全问题,或者是否有更安全的更优选方式?

2 个答案:

答案 0 :(得分:7)

如果您想为用户提供此功能,则需要注意以下两点:

  • 必须及时设置创建的网址的有效性(例如:24小时,48小时)。
  • 创建的网址必须仅适用于一个特定用户。
  • (optionnal)创建的网址仅适用于一个页面

我建议使用这种解决方案来创建符合这些标准的网址(这只是概念证明):

<?php

$privateKey = 'somethingVerySecret';
$userName = 'cedric';
$url = 'my/personal/url';
$timeLimit = new DateTime('Tomorow');


function createToken($privateKey, $url, $userName, $timeLimit){
    return hash('sha256', $privateKey.$url.$userName.$timeLimit);
}

function createUrl($privateKey, $url, $userName, $timeLimit){ 
    $hash = createToken($privateKey, $url, $userName, $timeLimit->getTimestamp());

    $autoLoginUrl = http_build_query(array(
        'name' => $userName,
        'timeLimit' => $timeLimit,
        'token' => $hash
    ));
    return $url.'?'.$autoLoginUrl;
}

function checkUrl($privateKey){  
    if((int)$_GET['timeLimit'] > time() ){
        return false;
    }

    //check the user credentials (he exists, he have right on this page)

    $hash = createToken($privateKey, $_SERVER['PHP_SELF'], $_GET['name'], $_GET['timeLimit']);

    return ($_GET['token'] == $hash);
}

答案 1 :(得分:0)

登录的一般标准是当用户创建一个帐户时,你的程序应该在php 5.5中创建一个带有某个php函数的随机字母和数字串,然后将它存储在一个带有某种指针的文件中在用户名上。然后,当用户尝试登录时,使用相同的功能并比较两个字符串。该函数为hash_pbkdf2,即使这个php函数支持sha ...加密也不使用那些。我使用用户名加密哈希码。 Here是一篇关于所有网站登录和密码的文章。你可以用你的网站做的最安全的事情是防止人们蛮力破解你的密码是为了限制连接速度,在一些错误的密码尝试到这么慢的东西之后,需要比宇宙的生命需要更长的时间来破解一对夫妇密码尝试。如果您想要记住我按钮存储cookie中的用户名但从不输入密码如果您正确标记表单元素,浏览器将负责记住密码部分。