2013-09-30 67 views
0

我有一個網頁... sorto像一個API ...基本上它打印出json形式的一些數據。其他如何找出哪個網站正在請求我的網頁?

網站可以通過簡單地使用file_get_contents

通過PHP使用這些數據

的JavaScript/jQuery的ajax request(JSONP)

反正我希望能黑名單一些不必要的網站,所以我必須知道這個請求來自哪裏

我試過

$url  = $_SERVER['HTTP_REFERER']; 
$domain = parse_url($url, PHP_URL_HOST); 

,但我得到

Undefined index: HTTP_REFERER 

所以如果我錯了,這是一個奇怪的例外,HTTP_REFERER不在這裏工作了。

那麼我怎麼能得到file_get_contents頁面請求的情況下的裁判?

+0

有沒有這樣的事情作爲一個JSON對象。 JSON是一個字符串。 – Mark

+0

@Marcel - 其實,你錯了。根據[JSON參考](http://www.json.org/),「在JSON中,它們採取以下形式: 對象是無序的一組名稱/值對,對象以{(左括號),並以}(右括號)結尾,每個名字後跟:(冒號),名稱/值對由(逗號)分隔。 – EmmyS

+0

是的,JSON字符串代表一個特定的結構,但OP輸出的輸出本身是一個字符串。 – Mark

回答

0

如果服務器直接請求它,那麼你可以使用$ _SERVER'REMOTE_ADDR'和'REMOTE_HOST'。

如果他們使用JavaScript,那麼你只會得到客戶端IP。您可以使用strtolower($ _ SERVER ['HTTP_X_REQUESTED_WITH'])=='xmlhttprequest')來禁止jquery請求。

+0

不要忘了代理的'X_FORWARDED_FOR' ...(對於OP來說:每個頭都可能被欺騙;同樣,IP不是絕對的度量,因爲有那麼多的代理) –

+1

我希望ppl會說爲什麼他們認爲我的回答是錯誤的,而不是簡單地downvoting ... – OIS

+0

我同意。應該強制性地對反對意見發表評論(或者至少列出用戶的姓名) –

0

是不是你要找的$_SERVER['REMOTE_ADDR']? AJAX調用可能不會有Referer頭,這就是爲什麼你會得到這個錯誤。

0

HTTP Referrer被瀏覽器發送,可能不會被file_get_contents()發送!可以使用$_SERVER['REMOTE_ADDR']。這將爲您提供來自TCP堆棧的原始IP地址。

在服務器端API調用的情況下,您得到服務器的IP(假設客戶端不使用任何代理)。

但是,如果客戶端是AJAX請求,您將獲得查看該頁面的用戶的IP地址。

0

HTTP_REFERER不會是可靠的。您可以嘗試$_SERVER['REMOTE_ADDR']來檢查遠程客戶端的IP地址。

但是我會認爲你會有更好的時間將被批准的客戶列入白名單,而不是黑名單,因爲攻擊者可以輕鬆地代理請求來繞過基於IP /主機的黑名單。

有許多方法用於whiltelisting:

  • 白名單已知的IP的
  • HTTP認證
  • 自己的自定義API密鑰
  • 第三方認證(即的OAuth)

等等。

1

注意,Ajax請求通常是通過客戶端瀏覽器發送的,而通常是服務器會打電話file_get_contents()或類似的工具,以獲取你的頁面。

因此,在服務器的情況下,您可以針對黑名單檢查REMOTE_ADDRHTTP標頭(它包含調用者的IP)。

對於Ajax請求,可能來自用戶代理,您無法真正說出來自哪個網站。

雖然我不知道,但HTTP_REFERER頭可能包含正是這樣,而我又沒有檢查它。

UPDATE (Ajax的請求)
找了一點點,我會證明,瀏覽器不XHR請求發送引用的數據,所以只能黑名單服務器的IP地址,你不要不想被訪問。

+0

感謝您對此信息的第n個回覆:P – OIS

+0

當時我寫這篇文章的時候並沒有意識到其他答案。我也做了一些研究後更新了我的答案,以提供更多的準確信息。 –

+1

thanx爲關於ajax部分的額外信息 – max

相關問題