2010-11-25 77 views
3

據我所知,網絡服務器(Apache/Nginx)根據聲稱的請求用戶代理的位置提供($_SERVER['REMOTE_ADDR'])。所以我明白他們可以說謊,但這有可能是空白的?網絡接口或網絡服務器是否會接受沒有正確形成IP的請求?REMOTE_ADDR可能是空白的嗎?

http://php.net/manual/en/reserved.variables.server.php

+0

你不能說謊你想把數據發送回去的地方...... TCP需要知道你的IP發送數據包給你,所以在它們甚至可以發送HTTP請求之前,TCP連接必須發送一個SYN/ACK到IP,以便建立連接... – tobyodavies 2010-11-25 16:20:03

+0

你可以肯定地說謊你想要發回數據的地方。這是某些形式的DoS攻擊的問題。 – Xeoncross 2010-11-25 16:23:00

+2

@Xeoncross:帶有源欺騙的DoS攻擊不會達到Apache - 網絡堆棧會被半連接狀態中的連接所困住(因爲沒有辦法可靠地生成「SYN/ACK」 ACK「) - 這甚至是許多DoS欺騙攻擊的關鍵:在某些系統上半開連接的表曾經很小*,並且一旦它被填滿就停止接受。無論如何,即使你設法以某種方式打開了帶有欺騙源地址的TCP連接,你所看到的只是一個*不同的REMOTE_ADDR,而不是空的。 – Piskvor 2010-11-25 16:29:04

回答

5

這在理論上是可能的,因爲這個問題取決於http服務器或至少相應的PHP SAPI。

實際上,我沒有遇到過這種情況,除了CLI SAPI。

編輯:對於Apache,似乎總是這樣設置的,因爲ap_add_common_vars總是將它添加到表中,最終被Apache模塊讀取PHP SAPI(聲明:我對Apache內部知識的知識非常有限)。

如果在CGI環境中使用PHP,在RFC 3875的規格似乎保證這個變量的存在:

 
4.1.8. REMOTE_ADDR 

    The REMOTE_ADDR variable MUST be set to the network address of the 
    client sending the request to the server. 
0

嗯,這是保留的,但寫。我看過寫得很糟糕的應用程序,這些應用程序正在全球各地塗寫 - 腳本是否可以覆蓋它,例如與$_SERVER['REMOTE_ADDR'] = '';

除此之外,即使請求進行代理,應該有代理服務器的地址 - 可能這是某種內部重寫模塊,它搞亂的(mod_rewrite允許內部重定向,不知道這是否會影響這個) ?

0

它不應該是空白的,並沒有什麼不能連接到您的網絡服務。無論連接什麼,都必須有IP地址來發送和接收數據。 IP地址是否可以信任是另一回事。

3

是的。我目前在Apache-behind-Nginx的日誌中看到「未知」的值,看起來像日誌中的正常請求/響應序列。我相信這是可能的,因爲mod_extract_forwarded正在修改基於X-Forwarded-For標頭中的數據重置REMOTE_ADDR的請求。因此,原始REMOTE_ADDR值可能是有效的,但作爲通過我們的反向代理和Apache的一部分,REMOTE_ADDR在到達應用程序時看起來無效。

如果您已經安裝Perl的libwww-perl,您可以測試這種情況下,像這樣的(改變example.com是你自己的域或應用程序):

HEAD -H 'X-Forwarded-For: ' -sSe http://www.example.com/ 
HEAD -H 'X-Forwarded-For: HIMOM' -sSe http://www.example.com/ 
HEAD -H 'X-Forwarded-For: <iframe src=http://example.com>' -sSe http://www.example.com/ 

(您也可以使用任何其他工具,它允許你使用自定義請求標頭手動發送HTTP請求。)

現在,請檢查您的訪問日誌以查看它們記錄的值,並檢查您的應用程序以瞭解它們如何處理錯誤的輸入。 `

相關問題