2010-10-05 49 views
2

我使用AJAX在我的網站上生成動作。例如,「搜索結果頁面」調用啓動「/getResults.php」的Ajax。該PHP文件返回一個包含結果的20個條目的JSON。 HTML頁面調用回調函數並用JSON的結果重新構建DOM。Ajax不可避免地導致公共API嗎?

因此,它似乎是不可避免的,在這種形式使用Ajax將導致公共API(只要發送「/getResults.php」與查詢的請求,你會得到易於使用JSON)。

反正是有阻止這些Ajax調用?設置數據庫條目時,這更爲尖銳,而不僅僅是檢索。

感謝,

喬爾

回答

4

由於「API」將不得不通過普通的HTTP請求訪問,這是通過定義「公共」。但是,它的播放方式與所有其他HTTP請求的規則相同。有人可以提交POST請求到您的表單提交頁面,而無需真正使用您的網站,這是完全相同的問題。您可以像保護您的POST提交一樣保護您的AJAX調用;即,不是在所有的,或通過要求餅乾,或通過要求一些特殊的令牌,或者通過施加IP過濾或節流等第

0

不,公共JSON API需要返回包裹在一個JavaScript函數,稱爲jsonp的JSON。 如果你只返回一個json對象,你很好。

+2

這隻適用於他想阻止其他站點使用來自他們自己的AJAX接口的那些接口。將它用作來自任何非瀏覽器消費者的API仍然是微不足道的。 – 2010-10-05 08:35:27

+0

是的。可以從服務器端發起呼叫。 – Joel 2010-10-05 08:40:43

+0

我讀暴露ajax json api ala flickr等方面的問題 – redsquare 2010-10-05 08:40:54

2

你可以使用隨機數或短暫的CSRF令牌。將其寫入頁面和會話中,並將其傳回請求。這增加了阻抗的位,但是這真的決心要得到你的數據的人不會有太大的這樣的問題,因爲他們可能只是屏幕刮令牌在自己的要求來使用。

你爲什麼想要保護這些接口,以及是如何重要,人們不能夠得到您的應用程序的外部訪問到他們嗎?如果您保護這些數據非常重要,那麼您需要採用非客戶端驅動的解決方案,不幸的是,您可能會意識到沒有AJAX。

+0

並非每個網站都使用會話,所以並不總是一個選項 – redsquare 2010-10-05 08:39:04

+0

還有其他選項,如使用'remote ip + endpoint URI + salt'的散列,但'd需要在頁面上消耗每個潛在端點寫入頁面的令牌。顯然,你必須適應產品的限制。目標只是在某種程度上要求用戶查看調用頁面,以便向其中一個端點發出請求。 – 2010-10-05 08:43:57

+0

像deceze寫道,通過HTTP的每個請求遭受同樣的問題。 AJAX的更大問題在於,使用處理Ajax調用的服務器端腳本非常簡單,因爲它旨在獲取簡單的變量並返回良好的結果。如果需要的話,外部來源使用它就太誘人了。它看起來最終歸結爲CSRF問題...... – Joel 2010-10-05 08:46:42

0

從jQuery .load()函數描述

由於瀏覽器安全限制,大多數「Ajax」請求都受到相同的源策略的限制;該請求無法成功從不同的域,子域或協議中檢索數據。

0

不,你正在創建一個公共API。

可能有些方法會讓你更難使用你的API,你只需要知道如何正確創建的某種校驗和就能混淆你的代碼。

將數據寫入服務器時,您始終應該對用戶進行身份驗證。現在適用於您的頁面的系統應該適用於您的AJAX調用。 (Cookie,HTTP身份驗證...)

0

「保護」的一個基本等級是檢查服務器上的HTTP_REFERER標頭,以確保請求來自您自己的網站。不過,這可能會被欺騙,所以我不會太信任它。