專業搬家,提供氣泡紙、紙箱完美打包
免費到府估價,搬家完全免煩惱
台北系統傢俱全方位清潔服務,精緻化清潔徹底除塵
死角灰塵全掃淨,還你潔淨居家

首頁  •  j2h 論壇 • 程式設計討論     • 

[php] 為何在 PHP 中盡量不要使用 $_REQUEST

房東:黑豹
發表時間:2011-05-20


為何在 PHP 中盡量不要使用 $_REQUEST



說服別人是一種藝術,而且若會影響對方長久以來的習慣更是一項挑戰。


 


$_REQUEST 的好處


$_REQUEST 因為預設可以通吃 $_GET / $_POST (在 PHP 5.2 之前,額外可吃 $_COOKIE / $_SERVER),所以好處是減少冗長的程式,以及彈性設計。


因此有些 PHP 程式設計師會習於使用 $_REQUEST,認為這樣無論來源是 $_GET 或 $_POST,他都不用修正程式碼。


安全性的考量不是重點


我於 Plurk 上有討論相關議題,但多數人的想法是往”安全性”來解釋。若單純就安全性來說,$_REQUEST 加上 filter_var 依然可以達到很高的安全要求,但是有些問題依然沒有解決。


什麼問題沒有解決?我認為是”設計邏輯性”或者說是”架構”。


當然,若是強制改用 filter_input 的確是可以解決問題,因為 filter_input 不支援對應的 $_REQUEST。可是若一個設計師長久以來就是使用 $_REQUEST 時,表示他不了解潛藏可能的問題,即使強制要求改用 filter_input,不僅他很容易覺得不舒服外,最後對於他而言,還是不明白原因為何。


架構考量


對於一個健全的架構或軟體而言,能夠有 (1) 良好的開發規範,及;(2) 減少開發過程中的錯誤發生率是很重要的。


在 Web 開發中,何時該使用 HTTP GET 以及 HTTP POST 其實大家都已經有共識,所以在架構考量上,何時用 $_GET 或 $_POST 應該有一定的規範,所以若一個架構同時接收 GET 及 POST 是一個比較罕見的 (我不能說不對)。


而且,如果用 $_REQUEST,可能會潛藏難以發現的臭蟲。例如 Client side 若寫錯,同時送 GET 與 POST 時,$_REQUEST 預設會接收 POST 而不是 GET。不幸的,Client side 開發者剛好以為他只送 GET 時,這時候很有可能會花比較多的時間除蟲。可更嚴重的問題會發生在 PHP 5.2 之前,因為 $_REQUEST 除了 $_GET / $_POST 外,還額外可吃 $_COOKIE / $_SERVER,按照預設的優先順序是 $_SERVER > $_COOKIE > $_POST > $_GET,如此問題發生時更難以發現及除蟲。(在心理學上可以這麼說,如果預知有此問題發生的人,開發時就不會用 $_REQUEST,而不知道有此問題的人,在發生問題的當下,根本不明白什麼問題,自然也不知道如何除蟲)


另外,HTTP GET 與 HTTP POST 有個共識,為了避免 Proxy server cache (代理伺服器快取)。敏感的資訊,例如帳號、密碼等,是不得使用 HTTP GET,因為很可能會被 Proxy server cache 而有安全的疑慮。因此,這時候若沒有考量到的話,而以 $_REQUEST 來接收,則讓 Client side 有機會曝露在危險的環境中。


架構考量 (續)


架構還有相容性的考量。


對於一個非獨立開發需要與第三方溝通的介面,或是需要特殊設定而這些設定可能與他人衝突時,$_REQUEST 的問題會更多。可以想像若 Joomla / Drupal / Wordpress 等軟體,太過於依賴 php.ini 設定時的嚴重性。


舉個例,倘若 Joomla 要求 php.ini 的 request_order (php 5.2 之前是合併於 variables_order) 是預設的 “GP” (表示 $_REQUEST 的順序是 $_POST > $_GET)。而 Drupal 要求的是 “GPC” 時 (表示 $_REQUEST 的順序是 $_COOKIE > $_POST > $_GET),這時候兩軟體架構就很有可能會造成難以除蟲的問題,甚至彼此衝突。因為兩者都太依賴 php 的設定值。


所以在設計一個良好的架構時,我們就不能假設客戶的 request_order 是 “GP” 而不是 “GPC”。由此也可以推論,最好不要依賴 $_REQUEST 的設計。


其它參考資料



補充:測試程式


這支程式可以簡單測試 $_REQUEST 的問題。預設在 PHP 5.3 會出現 POST 的值, PHP 5.2 會出現 COOKIE 的值。


<?php
setcookie("value", "cookie", time()+3600);
echo "===GET===<br />";
echo $_GET['value'] . "<br />";
echo "===POST===<br />";
echo $_POST['value'] . "<br />";
echo "===COOKIE===<br />";
echo $_COOKIE['value'] . "<br />";
echo "===REQUEST===<br />";
echo $_REQUEST['value'] . "<br />";
?>
<form method="post" action="?value=get">
<input type="text" name="value" value="post"/>
<input type="submit" value="submit"/>
</form>





  • 贊助網站       

    廣利不動產-板橋在地生根最實在--新板特區指名度最高、值得您信賴的好房仲
    完整房訊,房屋、店面熱門精選物件,廣利不動產 優質仲介,房屋租賃、買賣資訊透明,交易真安心!
    廣利不動產-新板特區指名度最高、值得您信賴的好房仲
    您的托付,廣利用心為您服務



  •  共 0 人回應

    姓名:
    佈告內容:
    其他選項: