2010-10-09 41 views
4

我是新來的使用AJAX,我只是按照教程從我的數據庫中使用AJAX檢索一些信息並將其輸出到頁面上。有一行我稱之爲數據庫查詢所在的php腳本,並且結果被回顯出來。我有點擔心,因爲文件名在前端是可見的,而且它的唯一目的是直接輸出數據庫結果,所以它可能會帶來安全問題。有什麼辦法來保護該文件,並確保它只在通過ajax腳本調用時才運行查詢?如何保護ajaxRequest.open php腳本

這裏是Ajax代碼有問題的位(注意 「somefile.php」 行):

ajaxRequest.onreadystatechange = function(){ 
    if(ajaxRequest.readyState == 4){ 
     var ajaxResponse = ajaxRequest.responseText; 
     element.innerHTML = '<h2>' + ajaxResponse + '</h2>'; 
    } 
} 
ajaxRequest.open("GET", "somefile.php", true); 
ajaxRequest.send(null); 

感謝您的任何答案。

回答

1

不,沒有。您信任給客戶端JavaScript的任何東西,您信任給用戶。

如果您有認證/授權,那麼您信任您授權的用戶。如果你不這樣做,那麼你相信每個人和他們的機器人。

+0

,你還可以創建一個一次性使用安全令牌並將其插入到ajax請求中,然後讓php檢查正確的令牌。這絕不是無與倫比的,但它會過濾出一些噪音 – pxl 2010-10-09 20:22:09

+0

確實(雖然這確實屬於「授權」:)標題:) – Quentin 2010-10-09 20:24:09

1

把你的PHP代碼此檢查中:

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') 
    { 
    /* Your code here */ 
    } 

所有Ajax請求確實有這個報頭組。由於所有的問題都可能被僞造,所以我們始終不相信來自客戶端的任何信息,過濾/列入傳入的請求參數並使用準備好的語句來照顧您的數據庫。

+0

如果您正手動進行Ajax調用,則不是這樣。主流框架添加了一些類似這樣的頭文件,但這並非總是如此,如果您手動創建頭文件,則需要自行設置它們。 – Dave 2010-10-09 23:45:28

+0

我一直在使用這個;我知道這不是完美的,但每一點都有幫助。無論如何,我只是在IE9中測試,但它沒有工作......評估錯誤。 – Ecropolis 2013-06-19 17:30:04

0

你必須擔心在存儲的xss。您可以在將數據放入數據庫之前或在打印出您的ajax響應之前,通過對數據執行htmlspeicalchars($var,ENT_QUOTES);來避免這種情況。

0

我解決它,如下所示:

if($_SERVER['HTTP_REFERER'] == 'http://' . $_SERVER['SERVER_NAME'] . '/mydir/myscriptwithajaxcall.php') 
    // do something 
else 
    echo 'Restricted Access'; 

然後PHP腳本,只有當它來自於特定的腳本(同一地點)的Ajax調用後執行。 注:我測試與會話和常量和沒有工作:/

+0

請注意,這可能無法使用,具體取決於用戶的瀏覽器和設置。瀏覽器沒有義務發送REFERER頭。 – lonesomeday 2012-10-26 12:44:21

0

我試圖保護的直接訪問名爲php文件幾種方法,這方面的工作:

if($_SERVER['PHP_SELF'] == $_SERVER['REQUEST_URI']) 
    exit('This file can not be accessed directly...');