2010-10-03 1 views
0

Для того, чтобы мой логин не работал, я использую 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.

+0

сколько пользователей вы ожидаете? –

+0

лотов, это будет сервис с множеством людей, которые подписывают и регистрируют его все время. Служба - это генератор сайта. –

ответ

6

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

(new Date()).valueOf(); 

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

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

-будет возвращает только секунду. Итак, ваше сравнение никогда не будет соответствовать.

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

Если вы действительно хотите сделать это Comparision, обеспечить временную метку к стороне сервера JavaScript в Бегин, и добавить перед подачей секунды истекших с этой меткой времени и использовать это как $ tmp.time

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

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

+0

Я подумал об этом, но тогда я должен был бы указать имя пользователя в текстовом формате, если только у вас есть другой метод .. закодировать одноразовый ключ, который соответствует для пользователя, все равно будет иметь цикл. –

+0

Время исправлено .. все равно не будет входить в систему. –

Смежные вопросы