2011-02-27 61 views
0

我想我忘記了代碼中的某些東西,但找不到什麼。PHP會話和AJAX請求(來自注入的JS代碼)

在我的服務器上我有簡單的logging.php文件。 如果我通過user/password參數,則會創建一個新的會話。 如果我通過loggout會話被銷燬。 如果我通過report屏幕上報告當前會話變量的列表。

如果我在瀏覽器中測試編寫網址的代碼,所有工作正常。首先調用.../logging.php?user=xxx&password=xxx。會話開始並向我報告會話變量。最後我銷燬了通過logout參數的會話。

如果用戶請求reportlogout並且沒有會話存在HTTP-401錯誤代碼返回給客戶端。

另一方面,我有一段JavaScript代碼,我可以使用書籤在網頁上注入。一旦代碼注入,我會顯示一個工具欄,用戶可以在其中寫入用戶/密碼併發送到服務器。

日誌記錄動作似乎正常,服務器返回200狀態碼,但後來如果我向logout發出請求,服務器返回401錯誤,這意味着沒有會話存在。

我正在使用chrome並查看HTTP請求,並且響應可以看到當我登錄服務器時返回不同的值爲PHPSESSIONID。 這意味着兩個不同的AJAX請求被視爲不同的會話。服務器似乎無法識別來自AJAX的第二個請求,就好像它是由同一客戶端啓動的一樣。

重複,PHP代碼工作正常,如果我直接使用瀏覽器執行,但沒有AJAX請求,所以我想我忘了AJAX中的東西。

任何想法?

在此先感謝。

更新

要,我的問題是從JavaScript調用PHP更簡潔。看起來沒有開始的會話。

想象一下,一個非常簡單的PHP代碼:

  • 的logging.php:給定一個用戶名/密碼啓動一個新的會話,也商店的用戶名作爲一個會話變量。

  • request.php:它返回存儲爲會話變量的用戶名。

  • logout.php:破壞會話。

我的第一個AJAX請求啓動一個PHP會話。這似乎很好,因爲PHPSESSIONID cookie是從服務器返回的。另外我將用戶名存儲爲會話變量。

第二個AJAX請求嘗試獲取用戶名(存儲在會話中),但它什麼都沒有,另外還有一個新的PHPSESSIONID cookie從服務器返回。

我知道這似乎是不可能的,當我使用瀏覽器url請求進行測試並且工作正常時,它是事實。

我忘了AJAX,到期時間或類似的東西?

再次更新

我做了一些測試,我發現這個問題,但沒有解決方案。

我的JS代碼是通過書籤注入的。 當我從我的服務器的HTML頁面注入代碼時,AJAX請求正常工作。第一個(日誌記錄)請求獲得一個PHPSESSID,該請求在隨後的請求中傳遞給服務器。

另一方面如果我加載google.com並注入代碼,第一個(日誌記錄)請求也會獲得PHPSESSID,但稍後它將不會隨下一個請求一起發送。

任何人都遇到過同樣的問題?這是問題嗎?

在此先感謝。再次

更新,再次

好了終於讓我找到了我的問題。因爲我的JS是從不同的域注入的(當前頁面來自domainA,而我的JS代碼來自domainB),Cookie不會跨域,所以可以共享PHPSESSID。

可能的結果是當我登錄時,我將返回JSON數據的PHP會話ID並將其用於後續調用。

+0

您可以提出您的問題conscise ..並清除 – 2011-02-27 12:17:51

+0

如果您有更新或更改您的問題,請包括他們通過編輯原始問題。我已經將您的帖子轉移到了您的問題。 – Sampson 2011-02-27 18:21:22

回答

0

如果我沒有錯,您嘗試通過使用URL中提供的用戶名和密碼向網址發送AJAX請求來登錄用戶?這不是一個真正安全的建設,密碼是非常脆弱的這種方式?!

我會建議你實現jQuery和使用$ .POST命令transer的登錄細節: http://api.jquery.com/jQuery.post/

確保您的所有文件(也包括由AJAX請求)包含在session_start();在文件的頂部。 當每個文件包含session_start();並且您使用相同的$ _SESSION變量來檢查用戶是否已登錄,它應該可以工作!

+0

與通過POST完成AJAX調用相比,用戶/密碼不容易受到攻擊。如果攻擊者在中間的某個地方,如果他們能夠嗅探這個URL,他們可以嗅探請求的主體。通過get登錄的主要缺點是u/p將被放入服務器的access_log中 – 2011-02-27 15:21:25

0

你的AJAX請求是否來自同一頁?請求是異步的,所以可能是「登錄?」請求在「登錄」請求經過之前返回其結果。

+0

正如我更新的AJAX請求來自注入到網頁中的JS。例如,我可以加載google.com頁面,然後注入JS代碼併發出請求。這樣請求似乎不會保留會話ID。 – EricSonaron 2011-03-02 16:02:44

0

從你問什麼,我希望代碼是(在其開始或多或少)是這樣的:

的文件的logging.php這樣的:

<?php # file : loggging.php 
if(!ini_set('session.auto_start')) 
// more stuff 
if(!empty($_REQUEST['user']) && !empty($_REQUEST['passwd'])) { 
    session_regenerate_sid(); // This is important (1) 
    $_SESSION['user'] = $_REQUEST['user']; 
    // Whatever 
} 

文件請求.php像這樣..

<?php # file : request.php 
if(!ini_set('session.auto_start')) 
// Whatever stuff to process data 
var_dump($_SESSION); 
    // Or a nice foreach($v as $i => $x) { 
    // echo("[$i] => $x\n<br />"); 
    // } instead :) 

和你logout.php應該讀一些如..

<?php # file : logout.php 
if(!ini_set('session.auto_start')) session_start(); 
session_destroy(); 

你可能不打電話或者session_start()或者你兩次調用它。

檢查了這一點試試這個:改變你的所有session_start()線:

現在
session_name('MYCoolNewName'); 
session_start(); 

您的會話應該PHPSESSID,相反,它應該是MYCoolNewName

如果不是,那麼你的問題是前面提到的。

(1)我把重要的session_regenerate_sid()因爲開放的認證會話是一個威脅。我會用一個例子來演示它。

Alice訪問coolwebsite.com/login.php,它給了她一個SID,我會打電話給AliceSID。 Alice告訴Bob訪問coolwebsite.com/login.php?PHPSESSID= AliceSID,並且當Bob確實Alice可以登錄他的賬戶時,除非Bob的會話被重新生成。