0

この問題を解決するために何日も費やしましたが、解決策が見つかりません。ajax フォーム + php バックエンドを使用してログインした後、ユーザーがリダイレクトされるページに「セッションがありません」というメッセージが表示され、$_SESSION をダンプしようとすると空のように見えます。次に、戻って同じログインを行うと、正しく機能します。これは、さまざまなブラウザー (通常は Cookie とキャッシュがクリアされている場合) およびさまざまなホスティング プロバイダーで発生します。

これは私のajaxコードです:


$(document).ready(function(){
 $('#loginbtn').click(function(){

if($('#username').val() == "" || $('#password').val() == ""){
            return false;   
        }
        else
        {

            $.ajax
            ({
                type: 'POST',
                url: 'ajax_login.php',
                cache: false,
                dataType: 'json',
                data:
                {
                    username: $('#username').val(),
                    password: $('#password').val()
                },
                success:function(data)
                {


                if(data.error === true){

alert("Failed to login: "+data.message)

                    }
                    else
                    {


        setTimeout(function() 
        { 
window.location = 'http://www.mywebsite.com/dashboard.php';
        },2000);  

                    }
                },
                error:function(XMLHttpRequest,textStatus,errorThrown){
            alert("An error occured!");

                }
            });
            return false;
        }

   });    

   });

これは PHP ログイン バックエンドです。

<?php
include "config.php"; // start session and connect to mysql db, also contain functions sanitize(), getip()

$username = sanitize(htmlspecialchars($_POST['username'],ENT_QUOTES));
$pass = sanitize($_POST['password']);


 // FUNCTION TO LOGIN
$sql = mysql_query("SELECT * FROM members WHERE username = '$username' AND password = '$pass'"); 
$array = mysql_fetch_array($sql);

if(mysql_num_rows($sql) === 0){
$message['error'] = true;
$message['message'] = "Wrong username or password.";    
echo json_encode($message); 
exit;
}


$_SESSION['username'] = ucwords(strtolower($username)); 
$_SESSION['points'] = $array['points'];
$_SESSION['ip'] = getip(); 
$_SESSION['welcome'] = true;


$message['error'] = false;
$message['message'] = "Completato.";    

echo json_encode($message); 
exit;

最後に、これは dashboard.php チェック セッション コードです。

<?php

include "config.php";
if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) ob_start("ob_gzhandler"); else ob_start(); 

if($_SESSION['username'] == "") {
header("Location: index.php?nosession");
exit;
}

編集:これは config.php の中身です

<?
session_start();
date_default_timezone_set("Europe/Rome");
$hostname = ""; //hostname 
$data_username = "dbxxxxxxxx"; //database username
$data_password = "xxxxx"; //database password
$data_basename = "dbxxxxxxx"; //database name
$conn = mysql_connect("".$hostname."","".$data_username."","".$data_password."");  
mysql_select_db("".$data_basename."") or die(mysql_error()); 

function sanitize($text) { // funzione che pulisce le stringe per prevenire exploit;
if(get_magic_quotes_gpc() == 0) {
$text = addslashes($text);
}
$text = htmlentities($text);
$text = strip_tags($text);
$escape = mysql_real_escape_string($text);
$arraydangerous = array('SELECT *', 'LOAD_FILE', 'DELETE', 'TRUNCATE', '\' OR', '<javascript>', 'src=', '<?', '?>', 'document.cookie', 'http://', 'www.'); 
$text = str_replace($arraydangerous, "", $text);
return $text;
}

function getip()
{
    return filtra($_SERVER['HTTP_CF_CONNECTING_IP']);   // I use CloudFlare ,so i must use this way :)
}

どうすればこれを修正できますか? ありがとう

4

2 に答える 2

1

config.phpで、この行を の後に追加しsession_start();ます。

session_start();

// reset the session, if not logged-in
if (empty($_SESSION['username'])) {

    $_SESSION['username'] = null; 
    $_SESSION['points'] = null;
    $_SESSION['ip'] = null; 
    $_SESSION['welcome'] = null;
}

また、 dashboard.phpを次のように変更した方がよいと思います。

<?php

include "config.php";

if($_SESSION['username'] == "") {
    header("Location: index.php?nosession");
    exit;
}


if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) ob_start("ob_gzhandler"); else ob_start(); 

?>

あなたの問題は、コードのテスト中にサーバー上にある古いセッションだと思います。たとえば、ログインしようとしてセッションに値を追加したが、なんらかの理由でいくつかのエラーが発生し、ログインしていないことがわかります。すでにセッションにいくつかのデータを追加したことを忘れていた場合は、更新します。 dashboard.php を見ると、すでにログインしているように見えます。その場合、コードがおかしい、ランダムに動作している、またはその他の無関係な理由であると考えるかもしれません。(数年前、私はその日に雨が降っているときは機能し、雨が降っていないときは機能しなかったコードを持っていました。幸いなことに、私はその問題を 2 日で解決しましたが、気が狂ってしまいました!)

コードを変更している間に、サーバーに保存されているすべてのセッションをクリーンアップして、クリーンなテストを確実に実行することもできます。

これらが何らかの形で役立つことを願っています。

于 2012-11-04T12:16:16.840 に答える
0

これが事実なのか何なのかはわかりませんが ( の中身がわからないためconfig.php)、「PHP Login Backend」ファイルでセッションを使用する前にセッションを開始するのを忘れていたようです!

于 2012-11-04T08:46:35.557 に答える