2011-04-13 59 views
0

我有一個奇怪的問題$_GET方法。我有一個PHP代碼:

$fopen("files/" . $_GET['file'], "r"); 

當我寫文件路徑參數我的自我它的運行很好,但是當我從$ _GET方法來獲取文件名就說明了我一些錯誤,如路徑是錯誤的。

  1. 它有什麼問題?
  2. 是否有$_GET方法的任何特殊編碼將其解碼爲正確的字符串樣式。我試過urldecode,但沒有做任何改變。
+4

你是否試圖打印你得到的? – 2011-04-13 13:40:25

+3

(a)您使用什麼URL來查看頁面? (b)'var_dump($ _ GET);'顯示了什麼?還要注意,$ _GET不是一種方法,它是一個變量,特別是PHP的[Superglobals](http://php.net/manual/en/language.variables.superglobals.php)之一。 – 2011-04-13 13:41:01

+0

'echo「文件/」。 $ _GET ['file'];'向我們展示結果 – Emmerman 2011-04-13 13:41:34

回答

1

不要經常使用用戶輸入而無需驗證,尤其是不能在主機上打開文件!我無法誇大這是多麼危險。如果某人在應用程序中輸入了值爲'../../../../../etc/password'的GET字符串,該怎麼辦?

+0

我陷入了困境。你是對的。我不知道爲什麼我這樣做,而我有我的數據庫中存儲的變量,可以用來獲取文件ID和下一個...感謝無論如何,你們所有人! – MahanGM 2011-04-13 16:37:05

2

在底部說:

  1. 嘗試轉儲$ _GET與打印的print_r或後續代碼var_dump
  2. 嘗試sanitize the input
  3. 在你的代碼刪除開頭$(** $ ** fopen)
  4. 測試指定目錄中是否存在if(is_file($ path)
  5. 是不是由文件擴展或權限造成的問題?

可能還有更多。它也取決於你使用的系統(Win,Unix,Mac ..)。

+1

這應該是對問題的評論,而不是回答。 – Treffynnon 2011-04-13 13:42:02

+0

嗨,我意識到,但我沒有看到添加註釋按鈕的問題。我是盲人還是ff 4不喜歡stackoverflow? :-) – Bery 2011-04-13 13:47:58

+0

@Bery Naah。你只是沒有足夠的聲譽。 – Emmerman 2011-04-13 13:52:38

3

第一條規則是消毒您的輸入。像這樣使用$ _GET只是要求麻煩。 做正確的事情。將$ _GET值放入一個變量中,確認它是有效的輸入,然後嘗試打開文件。

+0

你知道,你指出了一個好東西,我會解決它。順便說一下,我驗證了我的數據,它確實是正確的。 – MahanGM 2011-04-13 16:32:42