2013-06-22 104 views
0

我有一個ajax.php文件,我的所有ajax調用都指向一個額外的當前調用腳本需要執行的參數。我的問題是,我想限制某些腳本僅由特定頁面執行,例如sendComment.php應該只能從www.mysite.com/user/{any user}調用。執行之前的Ajax驗證頁面

我所做的是把這個代碼在每個腳本的頂部,我想限制:

if(strstr($_SERVER['HTTP_REFERRER'],'mysite.com/{page_allowed_to_exec_script}'){ 
    Then do stuff here 
} 

但是我來有什麼要注意的是,並不是所有的瀏覽器都支持HTTP_REFERRER(我可能有拼寫錯誤,我正在通過記憶來寫這篇文章),而且也不是跨瀏覽器,它也是一個痛苦的屁股,不得不在所有文件中對這些東西進行硬編碼,並且當它變得更大時來改變的東西..我正在尋找一種方式,我可能會擁有所有能夠執行它們的頁面的數組中的所有腳本,並在開始時執行ajax.php文件中的檢查。

有沒有人有任何想法這可以實現?

+1

一般來說,您不限制可以訪問服務器端資源的*頁*,限制可以訪問它的*用戶*。身份驗證cookie等事情仍然通過AJAX請求發送,因此您可以像限制任何其他頁面請求一樣限制用戶訪問。真的沒有理由限制請求來自哪個頁面。 – David

+0

不,我限制頁面,而不是用戶。我剛剛舉了一個用戶頁面的例子。同樣的腳本'sendComment.php'不應該能夠從其他地方調用,比如說'www.mysite.com/home'例如 –

+0

這就是我的觀點,你是在倒退。限制頁面不正確。特別是因爲在服務器上確實沒有可靠的方法來了解客戶端上當前的「頁面」,如果有的話。你的AJAX服務應該只是API調用,不需要關心他們被調用的方式或內容,除了任何必要的用戶認證和授權之外。 – David

回答

1

即使所有的瀏覽器都不能發送「引用者」,因爲某種「代理」,「防火牆」或「安全」套件剝離了它甚至改變了它。所以你可以信任它。

如果您控制引薦頁面,您可以使用會話,cookie或URL傳遞信息,如果您覺得這是至關重要的。如果這絕對是至關重要的,那麼唯一的選擇就是會話。其他兩個可以很容易地刪除。

+0

這就是我最初的想法,但我希望不必使用會話。我在整個項目中都避免了這一點:< –