2011-02-05 24 views
1

驗證$ _GET和$ _POST變量的實際名稱是否有意義使 確保只輸入允許的變量?驗證輸入變量的名稱是否有意義?

例如,假設一個PHP腳本看到形式線程需要一個字符串是這樣的:

的index.php主題ID = 5 &排序依據= lastpost &排序= ASC

是否添加更多的安全性驗證只有'threadid','orderby'和'sort'可以用作變量名稱?

例如有人將& dostuff = true添加到字符串中會出現某種類型的錯誤 只是想知道這是否有助於以任何方式使腳本更安全。

感謝

回答

2

只要你沒有register_globals激活我沒有看到驗證字段名稱的任何價值。您通常事先知道您需要哪些變量並相應地驗證其值。

register_globals(即非常不鼓勵)來自請求的變量可能會隱藏您自己的未初始化變量。有關此處的更多信息,請參見:http://www.php.net/manual/en/security.globals.php

+0

有用的事情。我會選擇這個選項。檢查允許的變量會增加額外的函數調用,不管它多麼微小,最好不要使用不必要的函數。 – Dmitri 2011-02-05 15:03:58

+1

這不僅僅是不鼓勵.. register_globals默認情況下從4.2.0開始關閉,並在5.3.0中不推薦使用,並且可能會在5.4或之後不久刪除。 – CaseySoftware 2011-02-05 15:19:34

1

只要register_globals未啓用,還有就是如果$_GET/$_POST存在不必要的按鍵繼續腳本的執行沒有風險。

0

如果腳本在Internet上可用,則可以由任何人調用腳本,並且可以傳遞該人決定使用的任何變量。僅僅因爲你有一個很好的系統設置,其中只有幾個變量被使用,黑客會嘗試提交很多常用的變量名(通過GET和POST),看看它們是否可以破解。

總之,你需要獲得的任何時間GET或POST變量的值,您需要過濾和/或清理它。 PHP有一個庫(PHP5 +,但PHP4支持在2007年停止,所以它不好用)。如果您需要更高級的功能,比如Zend Framework Zend_Filter,那麼在各種框架中還有其他庫。

http://www.w3schools.com/php/php_ref_filter.asp

http://www.php.net/manual/en/book.filter.php

這裏有一些方法,你可以使用它。上面的列表將顯示所有要使用的標誌。

獲取變量後,驗證它

$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL); 

獲取變量後,消毒它

$url = filter_input(INPUT_POST, 'url', FILTER_SANITIZE_URL); 

您可以創建自己的過濾功能,如果你真的需要。

0

只要謹慎行事:好主意。但我也認爲它沒有什麼實用價值。

因爲無論如何,典型應用程序忽略未知參數,我相信沒有安全風險。但實際上我已經考慮至少在array_intersect_assoc($_GET, $_POST)發生時創建日誌條目。 (參數應該只出現在一箇中,否則它有點不明確,但是對於另一個應用程序,我確實是出於可靠性的原因。)

對應點:CodeIgniter和/或Kohana完全按照您的建議進行操作。它們使用預定義的過濾器列表,並且不會讓您訪問未配置的輸入變量。所以顯然是一個共同的想法

1

它根本沒有任何效果,除非您重複了$_GET,$_POST等人之一的內容。大多數情況下,您使用帶有這些變量的靜態鍵,即$_GET['orderby']而不是$_GET[$orderByKey]

但是,即使您曾經迭代過這些值,正確處理這些值也是可取的。例如,如果您要在HTML文檔中輸出它們,請使用htmlspecialchars轉義數據,或將它們作爲準備好的事務中的值(而不是直接在您構建的查詢字符串中)用於數據庫訪問。

相關問題