我的登录不起作用,我不明白为什么? [请帮忙]

时间:2010-10-03 03:55:35

标签: php javascript login

由于我的登录不起作用,我使用PHP和JavaScript这样做。

PHP:

$users = sql("SELECT * FROM USERS WHERE SITE_ID='${CONFIG["ID"]}'");
if($_REQUEST["logindata"]){
    $logindata = $_REQUEST["logindata"];
    $now = array_shift(explode(" ",microtime()));
    if($_REQUEST["time"] < strtotime("+10 sec",$now) && $_REQUEST["time"] > strtotime("-10 sec",$now))
        exit(json_encode(array("TYPE"=>"FUNCTION","FUNCTION"=>"(\$login.failed(\"Time out for this request.. (Go away bots)\"))")));
    foreach($users as $user){
        if(hash_hmac("sha1",$user["LOGIN_SALT"],hash_hmac("sha1",$_SERVER["REMOTE_ADDR"],$_REQUEST["time"])) == $logindata){
            $_SESSION = $user;
            $_SESSION["ACTIVE_IP"] = $IP;
            sql("UPDATE USERS SET ACTIVE_IP='${IP}' WHERE LOGIN_SALT='${user["LOGIN_SALT"]}'",0);
            $result = json_encode(array("TYPE"=>"FUNCTION","FUNCTION"=>"(\$login.success())"));
        }
    }
    !$result ? $result = json_encode(array("TYPE"=>"FUNCTION","FUNCTION"=>"(\$login.failed())")) : void;
}

JavaScript的:

    login: (function () {
        $("#ajax_loading").fadeIn("fast");
        $("[type=submit]").fadeOut("fast");
        $tmp.time = "" + (new Date()).valueOf();
        return $functions.request({
            type: "plugin",
            plugin: "login",
            time: $tmp.time,
            logindata: $.sha1($.sha1($.sha1($("#username").val(),$("#password").val()),$client.domain),$.sha1($client.IP,$tmp.time))
        });
    }),

$ .sha1函数,如果给出一个字符串,则为sha1,如果为2,则会给出hmac_sha1结果。

1 个答案:

答案 0 :(得分:6)

首先:看看时间并进行比较。

(new Date()).valueOf();

- 会给你微秒,而

array_pop(explode(" ",microtime()));

- 只会返回秒数。 所以你的比较永远不会匹配。

但是,比较客户端时间和服务器时间并不是一个好主意,因为你假设它们具有相同的正确时间集,并且位于同一时区。

如果你真的喜欢这样的比较,请在开始时为javascript提供服务器端时间戳,并在将经过的秒数提交到该时间戳之前添加,并将其用作$ tmp.time

但是你会这样做,时间,域名或IP之类的东西如果发送它们几乎是无用的,虽然它们不可靠并且可以很容易伪造。

还有什么:你最好使用你自己的DBMS可以处理的哈希值,这样你就可以直接使用Query获取你想要的1个用户,而不必遍历所有用户< / p>

相关问题