2011-02-21 76 views
1

昨天我搜索了幾乎所有關於php會話的主題,我查看了手冊,但仍然無法正常工作。因爲這個,我熬夜很晚。即使會話ID正確,PHP會話也是空的

情景是:我使用標準的HTML表單登錄。我的會話中填充了一些變量,它工作正常。然後我使用閃存uploadify上傳一些照片,並通過參數 - PHPSESSID。我的PHP腳本不識別會話。它認爲它是空的。然後我嘗試使用不同客戶端的會話,例如FirefoxOpera,並且它也是空的。然後我嘗試使用不同的Chrome選項卡和它的工作

正如你看到我唯一的保護是通過IP。我不掃描其他的事情,所以當好PHPSESSID傳遞也不管客戶端類型,版本等

這是init_session.php,文件的客戶端IP是匹配我包括其他文件開始時每次這個應該工作。因此我知道會話ID正在通過Flash傳遞。但是然後會話是空的。

目錄設置在頂部,路徑是直接的,所以不應該有任何問題。當保存路徑爲默認時,它也不起作用。我也轉向會話自動啓動和會話只使用cookie。除了我需要手動設置cookie之外,它沒有改變任何東西。

這裏有什麼我可以嘗試嗎?我想我沒有選擇。

編輯:
我忘了最importat件事,我認爲關閉suhosin.session.cryptua將解決情況,但使用的ini_set我不能把它關掉,還有沒有其他的辦法嗎?看來,這個選項加密會話使用用戶代理字段將如此。

ini_set('session.auto_start', '0'); 
ini_set('session.save_path','/public_html/nowy/tmp'); 

if (isset($_POST["PHPSESSID"])) { 
    session_id($_POST["PHPSESSID"]); 
} elseif (isset($_COOKIE['PHPSESSID'])) { 
    session_id($_COOKIE["PHPSESSID"]); 
} elseif (isset($_GET["PHPSESSID"])) { 
    session_id($_GET["PHPSESSID"]); 
} 
session_start(); 
setcookie("PHPSESSID", session_id(), time()+3600, "/"); 

if (!isset($_SESSION['user'])) { 
$_SESSION['user'] = 0; 
} 

if (!isset($_SESSION['initiate'])) { 
    session_regenerate_id(); 
    $_SESSION['initiate'] = true; 
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
} 

echo ini_get('session.save_path').'<br />'; 

echo $_POST["PHPSESSID"]; 
print_r($_SESSION); 

議決

這個問題已經解決了。我無法設置cryptua,因爲我需要複製oryginal php5.ini並替換一些變量以使其正常工作。

的問題是預期suhosin.session.cryptua

+0

呃......當你只關注技術上必要的基礎知識時,你能初始化一個會話嗎?如果是,則描述沒有所有霧的症狀,如果不是,則嘗試在另一個之後添加一個技術細節直到問題再次出現。 – Raffael

+0

工作的正常請求和uploadify提出的請求之間有什麼區別?例如。你是通過相同的主機名/子域請求腳本嗎? – Frode

+0

請參閱更新。我忘了提及,但主要的不同之處在於**用戶代理字段**,因爲其他瀏覽器也不工作 – Kaminari

回答

2

正如Frode在他的評論中所建議的,我將這作爲一個swer。

這可能發生在使用任何 Flash腳本,而不只是uploadify。除非用戶代理字段相同,否則任何其他Flash上​​傳程序(如SWFUpload)都不會獲得該會話。

這發生在你的服務器上安裝補丁suhosin但似乎有時即使設置suhosin.session.cryptua啓用爲alecgorge建議不會發生此問題。雖然我不相信這一點。當然,你可以通過使用PHP腳本來傳遞這個變量來發現用戶瀏覽器的用戶代理,然後Flash可以將自己僞裝成同一瀏覽器,但這不是優雅的解決方案,我不知道動作,所以我不能說閃光實際上可以做到。

非常重要: 實際上有設置,可以修復此安全修補程序。

  1. suhosin.session.encrypt
  2. suhosin.session.cryptua

如果第一個是禁用,則會話並不因此不會出現問題加密。不建議禁用此功能。如果我們只禁用第二個,那麼會話將被加密,但加密不會在用戶代理字段上中繼。這意味着任何瀏覽器或http客戶端都可以獲得任何會話。因此建議放置一些其他安全字段。 Suhosin也可以處理會話ip保護,因此我建議啓用suhosin.session.cryptraddr。其他設置可以在這裏找到:如果安裝了Suhosin

  1. 檢查phpinfo()函數:
    Suhosin configuration

    要解決這個問題,我建議。如果沒有,那麼問題就不會發生。

  2. 如果安裝了suhosin並且suhosin.session.cryptuasuhosin.session.encrypt已啓用,請複製現有和正在運行的php.ini。這是對PHP的信息頁面的頂部:Loaded Configuration File /public_html/php5.ini
  3. 創建您自己的php.ini,並設置:
    • suhosin.session.encrypt =在
    • suhosin.session.cryptraddr =在
    • suhosin.session。 cryptua = Off
+0

請注意使用啓用suhosin.session.cryptraddr可能會中斷訪問某些代理的訪問者(某些公司代理在多個代理服務器之間以非粘性方式平衡用戶連接,每個代理服務器具有不同的IP)。 –

0

通常與Uploadify我必須做​​這樣的事情:

$('#uploadify').uploadify('scriptData':{'session_name':'<?php echo session_id(); ?>'}}); 

在客戶端結合在服務器端是這樣的:

if($_POST['session_name']) { 
    session_id($_POST['session_name']); 
} 
session_start(); 
+1

當然,我發送帶有uploadify參數的會話ID。請閱讀全文並更新。我認爲suhosin就是這種情況。 – Kaminari

+0

哦,我讀了所有的東西。只是這是一個非常常見的錯誤,通常當人們認爲他們已經避免了這個陷阱時,他們經常會陷入其中。是否將會話作爲名爲PHPSESSID的獲取變量發送?嘗試將其稱爲別的東西,然後像這樣發佈。然後刪除刮過後得到的東西和Cookie的PHPSESSID。 –

+0

另外,我在啓用了'suhosin.session.cryptua'的服務器上使用它,我沒有問題。 –