2011-04-26 95 views
0

對於我的網站上的AJAX,我從Javascript文件調用something.php?request = bla。我不希望用戶查看此請求的結果,或者通過輸入www.myurl.com/something.php?request=bla來運行PHP文件。我只希望我的服務器上的文件能夠調用PHP文件。我考慮過很多事情,比如在PHP腳本中進行比較的祕密值,但這聽起來太複雜了,無法滿足我的需求。我確信有一個更簡單的方法。如何僅允許從服務器上的文件調用PHP腳本?

如何讓PHP文件只有在服務器上存在的腳本調用它時才能運行?用戶不應該能夠使用他們的地址欄運行它。

+1

恐怕沒有比生成包含專用AJAX請求的頁面時創建唯一散列更簡單。將散列保存到會話中,並作爲AJAX調用的參數。在PHP腳本調用後,通過將提交的散列值與保存到會話中的散列值進行比較來決定該調用是否是私人的。就像Pekka所說,AJAX請求是客戶端,所以你不能以任何方式控制它。 – 2011-04-26 11:37:37

回答

1

對所有的AJAX調用使用POST,並拒絕所有的GET請求。這不會是完美的,但它會很好。

+0

謝謝,我想我會和JürgenThelen的建議一起做到這一點。我不應該首先使用GET。 – Dalal 2011-04-27 20:18:41

+0

取決於你的「足夠好」的定義。對於某人編寫腳本,或僅僅是一個查詢相同信息的HTML頁面,這仍然非常容易。所以,只有當你想擺出一個容易出現的小障礙時,這才「足夠好」。如果這是你的目標,那麼這個答案很好。 – thomasrutter 2012-07-22 13:59:39

8

這是根本不可能的。您的Ajax請求始終來自客戶端。

您可能在理論上檢查了HTTP_REFERER標題,但作爲安全措施,這完全是沒用。來自客戶端的請求(Ajax或不)的每個方面都可以自由操縱,包括referer字段。僞造一個據稱在您的頁面上啓動的Ajax請求是微不足道的。

您應該沒有必要首先施加這樣的限制:如果您有安全系統(如登錄名),則該系統的限制將(或應該)應用於Ajax請求。

如果您的Ajax請求在沒有身份驗證的情況下允許發生有害操作(如刪除),則需要添加身份驗證。您無法將這些請求限制到特定的上下文或網站。

+1

提及HTTP_REFERER爲可僞造的+1。 – 2011-04-26 11:39:00

0

由於解決方法(僅!),你可以探測的X-Requested-With:頭。這區分了真正的AJAX請求和地址欄調用。您無法確保請求的來源。

if (stristr($_SERVER["HTTP_X_REQUESTED_WITH"], "XMLHttpRequest")) { 

(你可以注入一些更模糊標題與您的$。阿賈克斯()調用。但同樣,這只是使它更加麻煩假的,不可能的。)

相關問題