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

Jam*_*Gen 0 javascript php 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;
}
Run Code Online (Sandbox Code Playgroud)

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))
        });
    }),
Run Code Online (Sandbox Code Playgroud)

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

Dr.*_*lle 6

首先:看一看时间并进行比较.

(new Date()).valueOf();
Run Code Online (Sandbox Code Playgroud)

- 会给你微秒,而

array_pop(explode(" ",microtime()));
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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