2013-04-10 57 views
1

我不知道是否有人能提出在這裏回答:PHP:從鏈接加入瀏覽器會話中的MS Office

我們這是使用PHP會話(和其他措施,如SSL保護的系統,任何人都開始前談論我的安全!),並且我們希望在與客戶聯繫有關特定問題時通過電子郵件向系統發送直接鏈接。我們發送的鏈接包括GET參數。

我們的建議是讓客戶確保他們已登錄,然後點擊鏈接 - 鏈接在瀏覽器中啓動,啓動會話,並將用戶直接轉到所需的頁面。但是,當用戶從Microsoft Office應用程序單擊鏈接時,這不起作用。

當從Outlook(甚至Excel)中點擊鏈接時,會話變量沒有被拾取,並且要求用戶重新進行身份驗證。進一步挖掘,看起來好像請求是通過將用戶代理設置爲Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0E; .NET4.0C; ms-office)來實現的,但該站點正在Chrome(也是設置會話的瀏覽器)中啓動。我想知道是否有一些會話安全代碼在踢,說如果瀏覽器不同,會話必須被欺騙?

試圖解決這個問題,我試圖初始頁面加載設置重定向頁面:

if (isset($_GET['targetpage'])) { 
    // It's a GET request - redirect using header-location 
    $all_get = $_GET; 
    unset($all_get['targetpage']); 
    $redir = $_GET['targetpage'].'?'.http_build_query($all_get); 
    header('User-Agent:'); 
    header("Location: {$redir}"); 
    die(); 
} 

這失敗:請求仍來自通過與用戶代理設置,以及會話缺席。

有什麼想法/建議嗎?

+0

那麼在重定向之後你看到了什麼用戶代理?它是空的,它是否仍然包含MS-OFFICE,或者它是否再次變得正常? – 2013-04-10 10:36:31

+0

@ nl-x,用戶代理以ms-office的形式出現,但是當未找到會話並且該網站重定向到登錄頁面時,該請求將使用Chrome的用戶代理字符串進行。 – almcnicoll 2013-04-12 09:45:34

回答

1

不要做header('User-Agent:'); ...因爲這會給一個空的用戶代理,而在隨後的請求中,正常的用戶代理將再次被使用。

而且你可以嘗試不同的HTTP 30x代碼......我知道瀏覽器的行爲有所不同,具體取決於所使用的確切30x代碼。

+0

我喜歡這個想法,並可能很快嘗試。我擔心的是跨瀏覽器(或者可能跨辦公版本)的行爲不一致。順便提一下。 – almcnicoll 2013-04-12 09:46:16

+0

順便說一下。你發送一個帶有某種散列的鏈接我假設你檢查第一頁並創建一個會話?正確?那麼它會在第一頁下一頁失敗?正確?爲什麼不發送散列......然後在第一頁上,重定向到沿散列發送的第二頁,但沒有創建會話。然後在第二頁檢查散列並創建會話? – 2013-04-12 10:27:26

+0

其實,沒有 - 這可能比現在更復雜一點。當用戶登錄時,他們會得到一個直接的PHP會話;我上班的鏈接必須是永久的,所以他們只需傳遞一個他們正在查找的內容的ID即可。它們需要在沒有會話存在的時候生成,所以我不能在會話中散列任何內容到鏈接中,也不能欺騙登錄,因爲它可能是任何用戶單擊鏈接。 – almcnicoll 2013-04-12 13:01:32

0

這只是一個部分解決方案,但對我來說它足夠好。

使用我們的網站需要啓用JavaScript,所以我不必擔心js禁用的用戶。我已經把一個JavaScript重定向,與「點擊這裏如果沒有重定向」鏈接,這似乎是足夠的。