2010-04-16 48 views
0

我正在使用登錄系統。當我在沒有登錄的情況下導航到comments/index.php時,一些變量會很好地使用GET方法傳遞。然後,如果我在本頁面上登錄,則這些變量消失。消失的變量是$ submission,$ submissionid和$ url。登錄後使用GET方法維護變量

我以爲我可以使用GET方法讓它們在登錄之後通過將?submission='.$submission.'&submissionid='.$submissionid.'&url='.$url.'添加到登錄表單操作的URL中來讓它們保持活動狀態,如下所示。但是我做了這個加法之後,變量仍然消失了。

我正在嘗試使用的相關代碼如下。

任何想法我能做些什麼來使它做我想要的?

由於提前,

約翰

在評論/ index.php文件:

require_once "header.php"; 

include "login.php"; 

include "comments.php"; 

在login.php中:

if (!isLoggedIn()) 
{ 

    if (isset($_POST['cmdlogin'])) 
    { 

     if (checkLogin($_POST['username'], $_POST['password'])) 
     { 
      show_userbox(); 
     } else 
     { 
      echo "Incorrect Login information !"; 
      show_loginform(); 
     } 
    } else 
    { 

     show_loginform(); 
    } 

} else 
{ 

    show_userbox(); 
} 

在的comments.php:

$url = mysql_real_escape_string($_GET['url']); 
echo '<div class="subcommenttitle"><a href="http://www.'.$url.'">'.$submission.'</a></div>'; 




$submission = mysql_real_escape_string($_GET['submission']); 
$submissionid = mysql_real_escape_string($_GET['submissionid']); 

登錄功能:

function show_loginform($disabled = false) 
{ 

    echo '<form name="login-form" id="login-form" method="post" action="./index.php?submission='.$submission.'&submissionid='.$submissionid.'&url='.$url.'"> 

    <div class="usernameformtext"><label title="Username">Username: </label></div> 
    <div class="usernameformfield"><input tabindex="1" accesskey="u" name="username" type="text" maxlength="30" id="username" /></div> 


    <div class="passwordformtext"><label title="Password">Password: </label></div> 
    <div class="passwordformfield"><input tabindex="2" accesskey="p" name="password" type="password" maxlength="15" id="password" /></div> 


    <div class="registertext"><a href="http://www...com/sandbox/register.php" title="Register">Register</a></div> 
    <div class="lostpasswordtext"><a href="http://www...com/sandbox/lostpassword.php" title="Lost Password">Lost password?</a></div> 

    <p class="loginbutton"><input tabindex="3" accesskey="l" type="submit" name="cmdlogin" value="Login" '; 
    if ($disabled == true) 
    { 
     echo 'disabled="disabled"'; 
    } 
    echo ' /></p></form>'; 


} 
+0

對於插入到SQL查詢中的數據,您應該只使用'mysql_real_escape_string'。 '$ url'被內插到一個HTML元素中,所以你應該用HTML注入來清理它。另外,查看預準備語句(和PDO)作爲轉義SQL值的更簡單的替代方法。 – outis 2010-04-16 03:02:03

+0

當我充實示例時,查詢字符串在Safari 4.0中傳播得很好。你有什麼要離開的。你測試了什麼瀏覽器?你使用任何重定向? – outis 2010-04-16 03:31:25

回答

1

$submission &℃。是當地的show_loginform。你要麼需要聲明他們globalyech),它們作爲參數傳遞給函數:

function show_loginform($submission, $submissionid, $url, $disabled = false) { 
    ... 

//login.php: 
... 
    // warning: vulnerable to injection attack. 
    show_loginform($_GET['submission'], $_GET['submissionid'], $_GET['url']); 

或做類似:

function show_loginform($disabled = false) { 
    // vulnerable to injection attacks 
    ?><form name="login-form" id="login-form" method="post" action="./index.php?<?php echo $_SERVER['QUERY_STRING']; ?>"> 
    ... 

最後一個是最乾淨,最簡單的,僅僅通過查詢字符串,而不是重建它。

+0

我怎樣才能「將它們作爲參數傳遞給函數」? – John 2010-04-17 01:16:05

+0

@John:你可以將任何值作爲參數傳遞給函數。答案已更新。 – outis 2010-04-17 01:51:04

+0

好的,謝謝......我試着做一個隱藏的POST方法,但後來它只是讓其他東西消失。嗯。 – John 2010-04-17 01:57:41

0

用戶會話......

<?php 
session_start(); 


$result = checkLogin($_POST['username'], $_POST['password']); 

if($result) { 
    unset($_POST['password']); 
    foreach($_POST as $k => $v) { 
     $_POST[$k] = trim(strip_tags($v)); // Fix injection 
    } 
    $_SESSION = $_POST; 
    $_SESSION['authenticated'] = true; // Changed the order to show authenticate 
} 
+1

'$ _SESSION = $ _POST;'會覆蓋$ _SESSION ['authenticated'] = true;'你所做的任務。可能想要將這條線向下移動。 – awgy 2010-04-16 03:01:24

+0

'$ _SESSION = $ _POST'應完全移除,因爲它會造成注入漏洞。此外,會話還會打破REST體系結構。 – outis 2010-04-16 03:05:12

+0

@awgy和@outis - 謝謝。進行編輯。會話如何打破REST以及問題中提到的REST的位置? – 2010-04-19 14:50:34

0

的$ _GET變量只會被傳遞到第一頁,所以你需要手動把它們。首先檢查用戶是否已登錄。如果不是,則顯示該表單。然後使用以下命令:

$query = http_build_query($_GET) 

這將生成一個查詢字符串了$ _GET變量。現在在表單的action屬性中,輸入./index.php?$query。 ?

這將確保他們沿着用戶登錄後通過

+0

他基本上已經這樣做了,只是沒有'http_build_query'。 – outis 2010-04-16 03:07:24

+0

不,它在我看來像他正在定義$提交,例如,他在login.php後包含的comments.php。因此,login.php無法將$提交回復到查詢字符串中。 – 2010-04-16 03:51:16

0

你在你的查詢字符串有一個錯字:提交=「$提交。」 & submissionid ='。$ submissionid。' & url ='。$ url。'

在提交至上行&之前替換$符號。

雖然你應該檢查注射漏洞的上述帖子。

好運