2013-07-14 75 views
0

我已經多次閱讀,使用$ _SERVER ['REMOTE_ADDR']從客戶端獲取IP是安全的,因爲它不能被用戶直接修改(僅通過使用代理等),但它總是返回一個IP。 直到今天,我收到來自我的網站的錯誤電子郵件,查詢檢查IP是否被禁止時發生mysql錯誤。

原始查詢看起來是這樣的:使用

$ip = $_SERVER['REMOTE_ADDR'] 

,因爲我認爲它不可能是我沒有做$ IP的任何消毒

SELECT * FROM `bans` WHERE `ip`='{$ip}' 

,並獲得一個IP做用戶... 修改,我收到一封電子郵件,該查詢失敗:

SELECT * FROM `bans` WHERE `ip`='1'"+order+by+1--+, 111.222.111.222' 

注:我已經把111.222.111.222的攻擊者,而不是實際IP)

我的電子郵件的腳本也需要使用$ _ SERVER [「REMOTE_ADDR」]的IP,所以我得到了「假」 IP在那裏了:

IP: 1'"+order+by+1--+, 111.222.111.222 

它很容易消毒,當你知道它可以被修改,但我想知道如何可能嗎?

+0

您是否檢查了相關問題? – Rainulf

+0

你可以跟蹤服務器訪問日誌中的這個請求嗎?那裏的IP地址是什麼? –

+0

我可以,IP是正常的日誌 - 111.222.111.222 - - [14/Jul/2013:00:04:11 +0200]「POST /somefile.php HTTP/1.0」200 561「http:// www。 site.com/some_other_file.php「」Mozilla/5.0(Windows NT 6.1; rv:21.0)Gecko/20100101 – Turshija

回答

0

不,這是不可能的。

你的代碼有兩個錯誤。

  1. 消毒的事情,通過方式思考如果變量是「安全」與否。雖然你應該格式你的SQL文字,留下那個沉重的思考準備好的聲明。
  2. 你有一些妥協的方式獲得$ ip。 $ip$_SERVER['REMOTE_ADDR']填寫不安全的方式。你可以在這裏找到很多答案來幫助你。
+0

1.我知道如何清理變量並使用準備好的語句,這不是我的問題。在這個項目中沒有準備好的陳述是由於其他一些無關緊要的原因。 2.如何獲得IP被泄露?查詢之上的一行是$ ip = $ _ SERVER ['REMOTE_ADDR'],它們之間沒有可能讓它們受到攻擊的單一行。 – Turshija

+1

哦,不幸的是,你沒有。 –

相關問題