Php $\u会话变量未在AJAX调用中设置
我编写了此用户身份验证调用:Php $\u会话变量未在AJAX调用中设置,php,jquery,session-variables,Php,Jquery,Session Variables,我编写了此用户身份验证调用: $( '.sign-in' ).click( function(e) { e.preventDefault(); var logincall = $.ajax({ type: "POST", url: "../snippets/auth.php", data: { username: $('#id_email').val(), password: $('#id_password').val() }
$( '.sign-in' ).click( function(e) {
e.preventDefault();
var logincall = $.ajax({
type: "POST",
url: "../snippets/auth.php",
data: { username: $('#id_email').val(), password: $('#id_password').val() }
});
logincall.done(function( result ) {
alert( 'finished: ' + result );
if( result == 'valid' ) {
location.reload();
} else {
$( '.warning' ).toggleClass('hidden');
}
});
logincall.fail(function( jqXHR, textStatus ) {
alert( "Request failed: " + textStatus );
});
});
下面是auth.php函数
if( isset($_POST['username']) && isset($_POST['password']) ) {
$username = $_POST['username'];
$password = md5($_POST['password']);
$query = "SELECT COUNT(*) FROM member WHERE username='$username' AND password='$password';";
$result = $mysqli->query($query);
$result = $result->fetch_array(MYSQLI_ASSOC);
if( $result['COUNT(*)'] !== 0 ) {
$_SESSION['logged'] = true; //this sets
$query = "SELECT id, level FROM member WHERE username='$username' AND password='$password';";
$result = $mysqli->query($query);
$result = $result->fetch_array(MYSQLI_ASSOC);
$_SESSION['uid'] = $result['id']; //this DOES NOT set
$_SESSION['lvl'] = $result['level']; //this DOES NOT set
echo json_encode('valid');
} else {
echo json_encode('invalid');
}
}
奇怪的是,如果我直接导航到
myurl.com/snippets/auth.php?username=myusername&password=mypassword
它确实设置了另外两个会话变量,但我永远无法使用index.php
来获取它们
我甚至向它添加了刷新行,以确保它能够拾取它们,并且它得到了
$\u会话['logged']
很好,但不是['uid']
或['level']
您不应该在$\u GET中发送身份验证详细信息。改用$\u POST。您不应该使用md5散列密码。改为使用密码\u散列。另外,在查询中使用绑定参数也是一种很好的做法。您是否记得在任何地方都session\u start()
登录代码都应该使用POST never GETT?这并不能回答问题,我只有一些提示。a) 不要通过URL查询(GET)发送密码,b)您可以在$.ajax
中为数据使用对象,如下所示:$.ajax({data:{username:''})代码>。还有一些提示:c)您的PHP代码非常不安全。永远不要假设用户输入的数据是安全的,永远不要将变量连接到SQL查询中。如果我决定以admin'和1=1;的身份登录,会发生什么代码>?您应该使用准备好的语句,请参见:,d)虽然可以使用对字符串进行编码,但实际上应该是对数组或对象进行编码<代码>json编码(数组('status'=>'valid'))
。然后在AJAX回调中执行:if(result.status==“valid”)
。不应在$\u GET中发送身份验证详细信息。改用$\u POST。您不应该使用md5散列密码。改为使用密码\u散列。另外,在查询中使用绑定参数也是一种很好的做法。您是否记得在任何地方都session\u start()
登录代码都应该使用POST never GETT?这并不能回答问题,我只有一些提示。a) 不要通过URL查询(GET)发送密码,b)您可以在$.ajax
中为数据使用对象,如下所示:$.ajax({data:{username:''})代码>。还有一些提示:c)您的PHP代码非常不安全。永远不要假设用户输入的数据是安全的,永远不要将变量连接到SQL查询中。如果我决定以admin'和1=1;的身份登录,会发生什么代码>?您应该使用准备好的语句,请参见:,d)虽然可以使用对字符串进行编码,但实际上应该是对数组或对象进行编码<代码>json编码(数组('status'=>'valid'))
。然后在AJAX回调中执行:if(result.status=='valid')
。