2011-03-22 52 views
2

我在PHP網站中的表單中收到$ _POST變量時遇到了麻煩。

爲了澄清這個問題,我創造了這個簡單的PHP腳本「POST_test.php」:

<? 
print "POST:<pre>"; 
print_r($_POST); 
print "</pre>"; 
?> 
<form method="POST" action="POST_test.php"> 
<input type="submit" value="Save Changes"> 
<input type="hidden" name="blah" value="1"> 
</form> 

比方說,我的Apache Web根目錄是「WEB_ROOT」,和我的網站文件夾是「websiteA」。將上面的腳本放在「web_root/websiteA」中,然後單擊IE7中的按鈕將產生一個空的$ _POST數組。將文件夾名稱更改爲「web_root/websiteA2」使其開始工作,並且還可以在Web根目錄中的其他網站(例如「websiteB」)中工作。使用Firefox時沒有問題。最近,NTLM身份驗證在我們的系統中啓用 - 我不知道這是否會有所作爲。

Apache & PHP運行在運行Debian Linux(稍微舊版本)的服務器上。

我也嘗試了IE瀏覽器頁面的ctrl-refresh,這並沒有幫助,也沒有重新啓動我的電腦。

更新:這個論壇帖子出現對問題進行描述: http://lists.rubyonrails.org/pipermail/rails/2006-March/027283.html

  1. 您不能發佈任何數據混合 NTLM和非NTLM身份驗證的Web站點 。在您訪問 一個經過NTLM認證的 網站文件夾後,Microsoft Internet Explorer 需要NTLM身份驗證才能訪問網站的所有 。

如下我可以證實這種行爲:

當我訪問http://mydomain/websiteA/index.php然後http://mydomain/websiteA/POST_test.php $ _ POST沒有提交測試頁填充。

但是,關閉我所有的IE7窗口然後直接瀏覽到http://mydomain/websiteA/POST_test.php顯示$ _POST是通過提交測試頁面填充的。

而且從上面鏈接論壇上發帖建議的解決方案之一似乎是:

我所看到的讓IE瀏覽器 的唯一途徑「忘記」它曾 NTLM身份驗證的網站發送401頁面狀態。這個 有效地重置IE認證狀態。

+0

請問如果你改變了'action'屬性的值,以'?'工作? – alex 2011-03-22 00:32:11

+0

否 - 該URL只是獲取?最後,但結果是一樣的。 – 2011-03-22 00:50:26

+0

這描述了一個POST數據與NTLM的問題: http://lists.rubyonrails.org/pipermail/rails/2006-March/027283.html 我會嘗試一些測試以查看行爲是否相似 – 2011-03-22 01:02:46

回答

2

感謝您的建議。

原來,這個問題是由先前請求無關的網頁,其中利用NTLM身份驗證的是這樣的(或類似)引起的:

<?php 
    if (!isset($headers['Authorization'])){ 
    header('HTTP/1.1 401 Unauthorized'); 
    header('WWW-Authenticate: NTLM'); 
    exit; 
    } 
?> 

之後驗證已完成,所有的$ _ POST數據在IE關閉並重新開放之前收到了空白。到目前爲止,我已經通過刪除上面的代碼解決了這個問題,而是安排Apache在我們的Intranet中使用NTLM(設置$ _SERVER ['REMOTE_USER']變量)。 (在我們的Intranet之外,Apache身份驗證仍在使用)。

+1

謝謝你一樣我的生活 – 2013-08-06 06:37:05

0

試着填充你的「行動」attibute,因爲我不認爲實際上會在IE7中離開這個屬性爲空。

+0

更改腳本使action =「POST_test.php」給出相同的結果。 – 2011-03-22 00:49:20

+0

它通常有效,但它在舊版本的Safari中存在缺陷。要解決Safari問題,可以使用'?'值。 – alex 2011-03-22 00:52:33

0

這個問題可以通過在IE中停用預認證被合作周圍。在註冊表中:

"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Internet Settings" 

在編輯菜單,添加值名稱DisableNTLMPreAuth作爲一種REG_DWORD和數據值設置爲1(true)。

欲瞭解更多信息,請參閱this bug reportMicrosoft KB 251404

+1

但是,如果這隻適用於客戶端,它是沒有用的網絡開發人員,對不對? – 2012-07-18 08:07:19

+0

鑑於O.P.實際上沒有提出一個問題,我認爲沒有理由對投票結果進行倒籤投票。在某些情況下,這種解決方法可能完全可以接受。 – 2013-10-04 07:45:44

2

工作很努力,我已經找到了這個問題的把戲。我用了整個NTLM身份驗證代碼,在我的PHP一個包括文件,其中的驗證完成之後,我不能讓因混合NTLM和非NTLM問題,這可能改變頁面的標題任何形式的POST。

,所以你必須做的就是包括相同的NTLM身份驗證碼,在網站的每個頁面的起點,也將這樣的伎倆。

問題就解決了...... :)

希望這幫助了很多人。

+0

謝謝,但如果您有不想編輯的第三方應用程序,這不太好。 – 2012-11-21 18:43:03

+0

感謝您的回覆,但研究了很多後,我已經什麼也沒發現,到目前爲止..除此之外還有另一種解決方案通過編輯Windows註冊表值,其在大多數情況下是不能被接受的用戶或可訪問。 – Sabbir 2012-11-22 04:45:54

+0

哦附加信息。在谷歌有人在談論使用Cookie存儲NTLM信息,然後發送一個請求401來清除NTLM標題,然後使用cookie來獲得您想要的信息和方法,當你明確了UR NTLM頭,它不會與POST方法混淆。但我發泄嘗試了它,甚至不能找到鏈接..所以如果有人試圖獲得任何成功,請在此處放下它.. – Sabbir 2012-11-22 04:52:36

相關問題