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(); }
}

logout.php

セッションの破棄/ヘッダーの場所の設定解除: index.php

この方法は十分に安全ですか?これを行う方法は何ですか?

ありがとう

4

2 に答える 2

1

これに関する 1 つの問題は、2 つのデバイス (したがって 2 つの異なる IP アドレス) から接続したいユーザー、または IP アドレスが変更される可能性がある接続 (モバイル/ダイヤルアップなど) 上のユーザーです。理想的には、hash_id と user_id を記録する「sessions」テーブルがあり、ユーザーが「session」に接続すると、そのテーブルからどのユーザーが接続されているかがわかります。

DB エントリには PDO の使用が推奨されます。http://php.net/manual/en/book.pdo.php 最初は怖いですが、理解できてすぐに第二の性質 (「簡単」) になります。

必要に応じて、セッションが「期限切れ」になるようにすることもできます。

あなたのコードは、誰かが Cookie を盗んで REMOTE_ADDR を偽装したり、誰かが電子メール アドレスを知っていて秘密鍵を解読できる可能性がありますが、ほとんどの場合、これで十分です。セッションに対して user_agent を保存する (これもスプーフィング可能)、ハッシュにさらに追加する (秘密鍵をローテーションする) などのプロジェクションを追加して、クラックを困難にすることができます。

于 2012-05-16T02:32:49.040 に答える