3

I'm trying to create a link that when clicked will login a user automatically and take them to a specific page.

I've thought about creating some sort of hashed string that contains the user's ID, username and a few other pieces of info. When clicked these pieces of information are looked up in the DB and if validated I login them in and redirect them to a specific page.

For sites like Twitter and Facebook when I receive an email notification and click the link in my email I'm automatically taken to my inbox on the corresponding site. I'm trying to duplicate that behavior...

Are there any security issues with doing something like this or is there a safer more preferred way?

4

2 回答 2

9

如果您想向您的用户提供此功能,您必须注意两件事:

  • 创建的url的有效期必须及时设置(例如:24小时、48小时)。
  • 创建的 url 必须仅适用于一个特定用户。
  • (可选)创建的网址仅适用于一页

我提出这种解决方案来创建一个符合这些标准的网址(这只是一个概念证明):

<?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);
}
于 2013-07-21T18:53:41.220 回答
-1

登录的一般标准是,当用户创建帐户时,您的程序应该使用 php 5.5 中的某个 php 函数创建一串看似随机的字母和数字,然后将其存储在一个文件中,并根据用户名使用某种指针. 然后,当用户尝试登录时,您使用相同的函数并比较两个字符串。该函数是hash_pbkdf2即使这个 php 函数支持 sha...加密不使用那些。我用用户名加盐哈希码。这里是一篇关于所有网站登录和密码事情的文章。为了防止人们暴力破解您的密码,您可以对您的网站做的最安全的事情是在几次错误密码尝试之后限制连接速度密码尝试。如果您想制作一种记住我的按钮,请将用户名存储在 cookie 中,如果您正确标记表单元素,浏览器将不会处理记住密码部分的密码。

于 2013-07-21T17:27:24.800 回答