2014-12-21 116 views
-3

嗨:我試圖使用$ _SESSION在PHP網頁上實現身份驗證;但是,它將我循環回身份驗證頁面。任何人都知道爲什麼?我使用的代碼如下:簡單的PHP身份驗證循環

在頁面需要身份驗證:

<?php 
session_start(); 
if(empty($_SESSION['authenticated']) || $_SESSION['authenticated'] != 'true') { 
    header('Location: duo.php'); 
} 
?> 

登錄/認證頁面:

<?php 
session_start(); 
include('duo_web.php'); 
echo "<center><h2>This site requires authentication.</h2>"; 
echo "<br><hr>"; 
unset($_SESSION['authenticated']); 
if(isset($_POST['sig_response'])){ 
     $resp = Duo::verifyResponse(get_cfg_var('duo_ikey'), get_cfg_var('duo_skey'), get_cfg_var('duo_akey'), $_POST['sig_response']); 
     if($resp != NULL){ 
       $_SESSION['authenticated'] = 'true'; header('Location: index.php'); 
     } 
} 
else if(isset($_POST['user']) && isset($_POST['pass'])){ 
     if($_POST['user'] == get_cfg_var('duo_user') && $_POST['pass'] == get_cfg_var('duo_pass')) { 
       $sig_request = Duo::signRequest(get_cfg_var('duo_ikey'), get_cfg_var('duo_skey'), get_cfg_var('duo_akey'), $_POST['user']); 
?> 
       <script src="Duo-Web-v1.bundled.min.js"></script> 
       <input type="hidden" id="duo_host" value="<?php echo get_cfg_var('duo_host') ; ?>"> 
       <input type="hidden" id="duo_sig_request" value="<?php echo $sig_request; ?>"> 
       <script src="Duo-Init.js"></script> 
       <iframe id="duo_iframe" width="620" height="500" frameborder="0" allowtransparency="true" style="background: transparent;"></iframe> 
<?php 
     } 
} 
else { 
     echo "<form action='duo.php' method='post'>"; 
     echo "Username: <input type='text' name='user' /> <br />"; 
     echo "Password: <input type='password' name='pass' /> <br />"; 
     echo "<input type='submit' value='Submit' />"; 
     echo "</form>"; 
} 
?> 

編輯:我想我的實際內容移動到back.index .php並只把上面的代碼放在它裏面,我仍然得到循環,所以問題必須在我的登錄(duo.php)頁面。我已經添加了上述頁面中的所有代碼。

回答

1

在需要驗證的頁面上,session_start()需要在打開的php標籤之後。

<?php 
session_start(); 
if(empty($_SESSION['authenticated']) || $_SESSION['authenticated'] != 'true') { 
    header('Location: duo.php'); 
} 
+0

這是我在加入代碼標籤時發生的一個錯字,更正了問題。 – user1864878

0

嗨:所以這是對我有用的。問題出在變量未保存到$ _SESSION。我不得不把它移動到不同的位置,在網頁和我換成「與「:

在頁面需要授權:

<?php 
ini_set("session.cookie_lifetime", "0"); 
ini_set("session.gc_maxlifetime", "3600"); 
session_start(); 
$var = $_SESSION["authenticated"]; 
if(strcmp($var,'yes') !== 0){ 
     header('Location: duo.php'); 
} 
?> 

在登錄頁面:

<?php 
ini_set("session.cookie_lifetime", "0"); 
ini_set("session.gc_maxlifetime", "3600"); 
session_start(); 
include('duo_web.php'); 
echo "<center><h2>This site requires authentication.</h2>"; 
echo "<br><hr>"; 
if(isset($_POST['sig_response'])){ 
     $resp = Duo::verifyResponse(get_cfg_var('duo_ikey'), get_cfg_var('duo_skey'), get_cfg_var('duo_akey'), $_POST['sig_response']); 
     if($resp != NULL){ 
       header('Location: index.php'); 
     } 
} 
else if(isset($_POST['user']) && isset($_POST['pass'])){ 
     if($_POST['user'] == get_cfg_var('duo_user') && $_POST['pass'] == get_cfg_var('duo_pass')) { 
       $sig_request = Duo::signRequest(get_cfg_var('duo_ikey'), get_cfg_var('duo_skey'), get_cfg_var('duo_akey'), $_POST['user']); 
?> 
       <script src="Duo-Web-v1.bundled.min.js"></script> 
       <input type="hidden" id="duo_host" value="<?php echo get_cfg_var('duo_host') ; ?>"> 
       <input type="hidden" id="duo_sig_request" value="<?php $_SESSION["authenticated"] = "yes"; echo $sig_request; ?>"> 
       <script src="Duo-Init.js"></script> 
       <iframe id="duo_iframe" width="620" height="500" frameborder="0" allowtransparency="true" style="background: transparent;"></iframe> 
<?php 
     } 
} 
else { 
     echo "<form action='duo.php' method='post'>"; 
     echo "Username: <input type='text' name='user' /> <br />"; 
     echo "Password: <input type='password' name='pass' /> <br />"; 
     echo "<input type='submit' value='Submit' />"; 
     echo "</form>"; 
} 
?> 

希望這幫助其他人