2014-12-05 65 views
1

我有一個具有以下功能的網站:用戶來到www.mysite.com/page.php。該網頁上的JavaScript,使AJAX API調用www.mysite.com/api.php和顯示效果在同一個頁面上www.mysite.com/page.php如何防止網站外部的API調用

我害怕的情況:有人開始用我的自己的軟件api.php的情況下,因爲使用成本www.mysite.com/api.php我有點錢。因此,我希望只有訪問過www.mysite.com/page.php頁面的用戶才能從www.mysite.com/api.php獲得有效結果。用戶無法登錄我的網站。

什麼是正確的方法來做到這一點?我想我可以開始一個會話,當用戶來到page.php,然後不知何故,可能首先檢查api.php有一個有效的會話ID會話存在?

+0

最大的問題是如何區分機器人與人類。編寫一個首先「訪問」你的網站,然後使用檢索到的會話ID /標記/任何訪問你的API的機器人並不是很難。 – lexicore 2014-12-05 17:19:34

+0

謝謝大家快速回復!儘管沒有100%的保護再一次,PHP會話可能是對這種情況最好的「軟」保護。 – Petri 2014-12-05 17:52:12

回答

0

如果你只是希望用戶使用api.php前,參觀page.php文件一個CAPTCHA,會話是要走的路。

+0

是的,這是我想要的。這可能是個愚蠢的問題,但我如何檢查api.php服務器上是否存在會話? – Petri 2014-12-05 17:21:51

+0

通過'session_start()'初始化會話並讀取已聲明會話的會話變量'$ _SESSION'。 [參見手冊:會話](http://php.net/manual/en/session.examples.basic.php) – twity1337 2014-12-05 17:39:58

+0

只需在每個php腳本(本場景中的page.php和api.php)中啓動seesion, 。然後在page.php中設置一個變量並在api.php中讀取它。例如: @session_start(); $ _SESSION ['allow'] = 1; 在page.php if(!empty($ _ SESSION ['allow']))... – 2014-12-05 17:41:19

0

如果在域的外部阻止它,請使用$ _SERVER ['HTTP_REFERER']檢查引薦。

當心人們可以改變他們的REFERER,所以它不安全。

另一種更好的解決方案可能是這樣一個從谷歌https://www.google.com/recaptcha/intro/index.html

+1

我不認爲,這是最好的方式,因爲它很容易從外部修改HTTP_REFERER。 – twity1337 2014-12-05 17:12:30

+0

@蒂米是正確的,完全不安全。 – lexicore 2014-12-05 17:13:46

+0

沒有身份驗證沒有安全的方法 – 2014-12-05 17:14:28

0

通常,如果您需要「軟」保護,請使用POST謂詞從您的站點獲取結果。然後,如果用戶在他們的瀏覽器中訪問URL,只需鍵入api.php調用,他們就不會得到結果。這不會保護您的網站,但它會讓搜索引擎遠離該網址並且意外瀏覽它。

否則,有很多用於php的身份驗證插件。例如

http://www.homeandlearn.co.uk/php/php14p1.html

+0

如果你有一個適當的REST API,使用post *作爲一切*不是一個好主意。 – burzum 2014-12-05 17:18:06

+0

POST可能會使api更難以使用,但對於某人開始使用它仍然非常容易。用戶不需要登錄我的網站,因此身份驗證插件可能不是解決方案。 – Petri 2014-12-05 17:28:02

+0

REST不是一切的答案。 – 2014-12-05 17:32:04

0

您可以通過多種方式,如令牌驗證,會話驗證,甚至通過服務器「HTTP_REFERER」變量

0

餅乾,HTTP-Referer的,額外的調整後數據或某種形式的數據檢查請求,您發送的隱藏的輸入字段不夠安全,無法確保用戶來自您的網站。

通過修改http-headerdata(或者如果您使用cookie,通過更改客戶端計算機上的cookie文件),用戶可以輕鬆更改它的一切。

我更喜歡PHP-Session結合防止機器人(如蜜罐)的良好保護,因爲如果正確使用它們,對於hi-jack來說並不那麼容易。

請注意:如果有一個特別爲您的網站的機器人,反正你失去了。所以沒有100%的保護。

+0

通過'session_start()'初始化會話並讀取已聲明會話的會話變量'$ _SESSION'。 [參見手冊:會話](http://php.net/manual/en/session.examples.basic.php) – twity1337 2014-12-05 17:42:11