2014-01-12 119 views
2

我有一個具有認證機制的PHP頁面。只有成功登錄後,我纔想顯示駐留在不同服務器上的PHP頁面。我可以使用iframe來做到這一點,但我關心的當然是有人可以在iframe中獲取src屬性的值,並直接跳轉到頁面 - 從而繞過安全機制。安全問題PHP加載iframe

什麼是最好的實施方式?如何阻止iframe中的頁面被繞過初始登錄直接訪問?

+2

如果外部網站沒有安全性,那就沒有意義 – 2014-01-12 05:05:36

+0

外部網站具有/可以具有安全性 - 問題是如何在外部網站上執行安全性以使用來自父網站的安全性?如何阻止iframe中的src被直接訪問? – oneiros

+0

http://stackoverflow.com/questions/44509/single-sign-on-across-multiple-domains –

回答

2

如果你不希望外部網站被拿起,我建議不要使用iframe。您可以通過使用file_get_contents() 將外部網站的內容直接放入當前頁面,這也允許一種簡單的安全形式,因爲您可以將認證詳細信息從現有服務器POST到遠程之一:

$opts = array('http' => 
    array(
    'method' => 'POST', 
    'header' => "Content-Type: text/xml\r\n". 
     "Authorization: Basic ".base64_encode("$https_user:$https_password")."\r\n", 
    'content' => $body, 
    'timeout' => 60 
) 
); 

$context = stream_context_create($opts); 
$url = 'https://'.$https_server; 
$result = file_get_contents($url, false, $context, -1, 40000); 

(例如,從PHP捲曲手冊上的file_get_contents 1的評論部分)

更復雜的方式(從長遠來看,又名更好,如果你必須弄明白的時間) 是要使用curl,您可以看到如何使用此問題的代碼獲取POST的結果:PHP + curl, HTTP POST sample code?

編輯:剛纔看到您的評論:

這種方法的問題是,加載在iframe外部網站進行大量的Ajax請求到駐留在同一臺服務器上的網頁。

沒有什麼可以阻止您在頁面內執行ajax請求。 當然,要求必須來自默認的相同的域名,但有周圍的途徑:

  1. 有自己的網頁充當中介PHP腳本:基本上它會通過AJAX到外部服務器,然後發送回 (上攻,操作簡單,缺點,產生因該請求被處理兩次額外的流量)的響應

  2. 跨來源資源共享https://developer.mozilla.org/en/docs/HTTP/Access_control_CORS)基本上,你告訴客戶,你將使用來自其他網站的資源。這種方式瀏覽器不會阻止它作爲潛在的劫持。

(見http://css.dzone.com/articles/ajax-requests-other-domains

這樣做的優點是它隱藏了iframe的來源,並允許兩個結構域之間使用身份驗證。與.htaccess結合使用可以非常安全,因爲您可以使用.htaccess,以便只有運行代碼的域/域才被允許訪問該頁面。

如果您必須使用iframe,當然您應該進行身份驗證,否則它將向全世界開放,因爲客戶端需要直接訪問該站點。您可以將數據發佈到iframe(請參閱Sending data through post method to an iframeHow do you post to an iframe?),其中包括將iframe設置爲表單,然後提交表單(您可以通過javascript自動執行)以獲取POST結果。

由於這將不得不在客戶端完成,它不僅公開了要發送的頁面,而且要發送什麼樣的請求。無論這是否是一個問題取決於您以及您希望使用您的程序的用戶是什麼類型。

至於curl,curl並不能解決iframe和ajax調用本身的問題,但它是一個比file_get_contents更高效,更靈活的url /網頁獲取命令/框架。

+0

這是我沒有使用file_get_contents()的原因:在iframe中加載的外部站點對駐留在同一服務器上的頁面執行大量的Ajax請求。如果我只是做了'file_get_contents',它只會粘貼該文件的內容,僅此而已。 curl將如何解決這個問題給我? (我不介意花時間學習捲曲? – oneiros

1

一個不那麼幹淨但有效的方法是通過file_get_contents加載遠程站點並輸出它。 儘管你可能會遇到資源路徑名喜歡的圖片,CSS,腳本的問題。 如果您控制遠程站點,則可以通過在任何地方使用絕對URL來修復它們。

如果性能問題您可能需要考慮緩存。

+0

這種方法的問題是,在iframe中加載的外部網站對駐留在相同網頁上的頁面執行大量的Ajax請求服務器。如果我只是做了'file_get_contents',它只會粘貼該文件的內容,僅此而已。所有這些ajax請求都會搞砸。 – oneiros

+0

在這種情況下,您必須在遠程服務器上實現某種安全性。您無法有效防止用戶抓取iframe網址並直接調用它。如果你可以依靠用戶不太聰明,那麼檢查引用者會給出一些非常輕的安全性。 – MrTweek