2012-01-04 41 views
7

拒絕用戶訪問腳本我有使用.live()加載它的網頁內容的jQuery腳本。我如何直接在網址

$('#content').load("content.php?" + id); 

問題:如何禁止用戶直接通過URL訪問文件content.php

我試圖把這個程式碼的content.php頂部,但拒絕訪問出現在我的#content DIV

if (!empty($_SERVER['SCRIPT_FILENAME']) && 'content.php' == basename($_SERVER['SCRIPT_FILENAME'])) 
    die('Access Denied'); 

什麼是確保用戶使用網址無法訪問我的文件content.php正確的方法是什麼?

+0

你爲什麼要拒​​絕他們訪問?如果他們無法直接訪問文件,那麼Ajax也無法訪問該文件。 – 2012-01-04 17:28:59

+0

你是什麼意思「無法直接訪問」。如果用戶可以通過JavaScript訪問資源,他還可以通過在他的地址欄中添加URL來訪問它。或者你的意思是他不應該能夠訪問content.php,而不通過正確的查詢字符串,就像你在javascript中的例子? – 2012-01-04 17:29:44

回答

6

你可以使用某種散列。例如,如果content.php具有參數id;您添加一個附加參數hash,其中包含「'一些隨機字符串'+ id * 15」的MD5散列。在content.php中,你檢查散列&的ID是否匹配;如果沒有訪問被拒絕。

計算在PHP做(沒有AJAX),因爲用戶必須知道散列algprithmus。

通過這種方法,用戶可以查找的源代碼,並直接訪問該頁面,但你不能禁止這完全地,因爲瀏覽器需要訪問的頁面來顯示它。但用戶無法訪問他以前通過ajax訪問過的頁面。您可以使用一些標題(HTTP_X_REQUESTED_WITH)來阻止大多數互聯網用戶直接訪問該頁面,但有經驗的用戶將更改標題並訪問它。

+0

但是在這種情況下,您將不得不在源代碼中顯示完整的URL,在您的AJAX調用中。那麼用戶可以簡單地瀏覽源代碼以找到正確的URL來使用?正如我在評論Fabrizio的回答時所說的那樣,真正能夠保護資源的是誰? – 2012-01-04 17:51:18

+0

是的;但用戶只能訪問他已經看到的內容。瀏覽器需要訪問該頁面;所以它必須是可訪問的。 – MasterCassim 2012-01-04 17:53:14

+0

的確如此,您可以通過這種方式保護沒有完整URL的人員的資源。也許我錯誤地解釋了這個問題,但是當我閱讀它時,我相信他會要求一種方法,使得只通過JavaScript訪問資源成爲可能,而不是直接瀏覽URL,在這種情況下,這將無濟於事。另一方面,我不明白你爲什麼想要這樣的限制。 – 2012-01-04 17:59:47

2

既然你調用通過AJAX資源的可能的解決方案是發送一個特定的頭到像HTTP_X_REQUESTED_WITH請求,然後檢測頭服務器端,像這樣:

/* AJAX check */ 
if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) || 
    strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest') { 

    die($content); 
} 
+4

這可以通過發送錯誤標題來利用。 – MasterCassim 2012-01-04 17:33:24

+0

這可能會阻止「普通」用戶直接訪問該頁面,因爲他們沒有查看源代碼並意識到他們可以發送預期的標題。但是,由於「常規」用戶不查看源代碼,並且不監視他們的HTTP流量,他們不知道所請求的URL開始(因爲請求是在後臺進行的)。那麼,我們是誰保護自己? – 2012-01-04 17:47:40

0

是否有對炫魅其他內容,你可以從content.php文件中引用,以驗證您加載它作爲炫魅,而不是一個獨立的頁面的一部分?你也可以通過主頁上的會話將內容傳遞給content.php頁面,然後在加載content.php結束時刪除該項目。

3

如果要保護使用情況,可以使用一次性密鑰算法。讓服務器生成一個頁面將包含在某個變量或屬性中的鍵。然後在加載命令你傳遞的關鍵,content.php這樣的:

key = $("{some selector to get the key}") 
$('#content').load("content.php?id=" + id + "key=" + key); 

一旦頁面使得呼叫服務器使用密鑰服務器將過期的密鑰使其無法使用。這樣只有活動頁面請求才能訪問你的content.php文件。

這種方法仍不能防彈,但會使其更加難以被用戶訪問content.php。

0

如果URL是用AJAX請求訪問的話,就可以直接訪問並沒有太多可以做的。你可以嘗試檢測是否請求與AJAX請求:

function isAjaxRequest() { 
    return array_key_exists('HTTP_X_REQUESTED_WITH', $_SERVER) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'; 
} 

,並在腳本的開始檢查它:

if (!isAjaxRequest()) 
    die('Access Denied'); 

,但你不應該依賴該檢查太多因爲繞過相當容易。