由于我的登录不起作用,我使用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结果。
答案 0 :(得分:6)
首先:看看时间并进行比较。
(new Date()).valueOf();
- 会给你微秒,而
array_pop(explode(" ",microtime()));
- 只会返回秒数。 所以你的比较永远不会匹配。
但是,比较客户端时间和服务器时间并不是一个好主意,因为你假设它们具有相同的正确时间集,并且位于同一时区。
如果你真的喜欢这样的比较,请在开始时为javascript提供服务器端时间戳,并在将经过的秒数提交到该时间戳之前添加,并将其用作$ tmp.time
但是你会这样做,时间,域名或IP之类的东西如果发送它们几乎是无用的,虽然它们不可靠并且可以很容易伪造。
还有什么:你最好使用你自己的DBMS可以处理的哈希值,这样你就可以直接使用Query获取你想要的1个用户,而不必遍历所有用户< / p>