Мой логин не будет работать и я не вижу почему?[ПОЖАЛУЙСТА ПОМОГИ] - PullRequest
0 голосов
/ 03 октября 2010

По какой-то причине мой логин не работает, я использую 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, а если два, то это даст результат hmac_sha1.

1 Ответ

6 голосов
/ 03 октября 2010

Прежде всего: взгляните на время и сравните их.

(new Date()).valueOf();

- даст вам микросекунды, а

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

- вернет только секунды. Таким образом, ваше сравнение никогда не будет совпадать.

Но вообще не стоит сравнивать клиентское и серверное время, поскольку предполагается, что оба имеют одинаковое правильное время и находятся в одном часовом поясе.

Если вам действительно нравится проводить это сравнение, предоставьте метку времени на стороне сервера для javascript в начале, добавьте перед отправкой секунд, прошедших к этой метке времени, и используйте это как $ tmp.time

Как бы вы ни делали, такие вещи, как время, домен или IP-адрес практически бесполезны, если вы отправляете их, они ненадежны и могут быть очень легко подделаны.

Что еще: вам лучше использовать хеши, которые ваша СУБД может обрабатывать самостоятельно, так что вы можете выбрать 1 пользователя, которого хотите найти, непосредственно с помощью Query, и не выполнять циклический просмотр всех пользователей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...