1
form submit { email|password }

php filter/check { mysql_real_escape_string etc... }

php set/login.php {

   $hash_logged = sha1(rand(100000,999999).$_SERVER["REMOTE_ADDR"].time());
   $_SESSION["hl"] = $hash_logged;
   mysql_query("UPDATE `users` SET `hash_logged`='".$hash_logged."' WHERE 
             `email`='".$emailLogin."'")or die(mysql_error());
   setcookie("hlc", sha1($emailLogin."longstringtoguess"), time() + 600);
}

所有 files.php 顶部的 php 脚本以验证用户是否已登录:

if(isset($_SESSION["hl"], $_COOKIE["hlc"]))
{
    $ext_hl =$_SESSION["hl"];
    $ext_cookie = $_COOKIE["hlc"];
    if(empty($ext_hl))  { header("location: logout.php"); exit(); }
    if(empty($ext_cookie))  { header("location: logout.php"); exit(); }

    $mysqlQ = mysql_query("SELECT `id`, `username`, `email`, `password` FROM `users`
                           WHERE `hash_logged`='".$ext_hl."'")or die(mysql_error());
    if(mysql_num_rows($mysqlQ) == 1)
    {
        $row = mysql_fetch_array($mysqlQ);
        if(sha1($row["email"]."longstringtoguess") == $ext_cookie)
        {
             $logged = "yes";
        }
        else {
            header("location: logout.php");
            exit();
        }
    }
    else { header("location: logout.php"); exit(); }
}

注销.php

会话销毁/取消设置标头位置:index.php

这种方法足够安全吗?你有什么办法做到这一点?

谢谢

4

2 回答 2

1

这样做的一个问题是用户想要从两台设备(之前是两个不同的 IP 地址)或那些在 IP 地址可能会更改的连接(例如移动/拨号)上连接的用户。理想情况下,您将有一个记录 hash_id 和 user_id 的“会话”表,然后用户连接到“会话”,并且您知道从该表连接的用户。

鼓励对 DB 条目使用 PDO。http://php.net/manual/en/book.pdo.php 起初很吓人,但很有意义,很快就变成了第二天性(“容易”)。

如果需要,您还可以确保您的会话“过期”。

您的代码受制于可能窃取 cookie 并欺骗 REMOTE_ADDR 的人,或者如果有人知道电子邮件地址并可以破解密钥 - 但在大多数情况下,这就足够了。您可以添加额外的投影,例如针对会话存储 user_agent(再次可欺骗)或向哈希添加更多内容(旋转密钥)等,以使其难以破解。

于 2012-05-16T02:32:49.040 回答
1

这种方法足够安全吗?你有什么办法做到这一点?

  1. 我不允许通过$emailLoginin进行 SQL 注入set/login.php我更喜欢通过EasyDB使用准备好的语句。
  2. 我没有将用户与会话关联(一对一),而是将当前会话与用户帐户关联(多对一)。这允许用户从多个设备安全且独立地进行身份验证。
  3. 我只是使用session_start()而不是试图建立一个看似安全的随机值。如果我需要直接创建随机性,我使用random_bytes().
  4. 我从不==用于比较字符串。
    • hash_equals()改用。
    • 违规线路:if(sha1($row["email"]."longstringtoguess") == $ext_cookie)
于 2017-12-29T04:33:57.827 回答