2015-11-11 41 views
3

我合作的一個項目,其中REST API的基本發展模式打破,因爲它有一個更包含錯誤報告的政策。下面是該項目中的典型行:注意:未定義指數警告,這將打破JSON輸出字符串未定義指數 - 安全風險VS業績VS代碼膨脹

public function someAction() { 
    // Returns a map of params => values sent with HTTP req 
    $params = $this->getParams(); 

    // This key may not exist --+ 
    //       | 
    //       v 
    $someField = $params['someField'] ?: 'default value'; 
    $someField = $this->sanitizeInput($someField); 

    // ... 
} 

其結果是,在開發模式JSON響應會經常與PHP散落。

我的問題

  • 究竟什麼是安全風險(如果有的話)假設一個變量已經被初始化,尤其是從$ _GET或$ _POST拉的時候嗎?
  • 難道是值得的麻煩要經過包裝和每次訪問與isset()array_key_exists()一些假設數組的鍵?
  • 我添加了周圍的整個應用程序提高在一定的動作民主基金指數警告個別鍵isset(),但代碼現在看起來超級臃腫...
+3

的代碼看起來並不臃腫* *( )'。它看起來*正確*。恕我直言。 –

+1

只是出於好奇,爲什麼不能在關鍵的出口?你把它當作人質嗎? – Dale

+1

我把它當作人質。贖金已經支付,鑰匙現在可以走... –

回答

4

忽略像這樣的錯誤的問題正是你所發現的 - 調試成爲一個巨大的痛苦,pottential真正的錯誤被視爲「正常行爲」被駁回。

然而,與編程任何時候,如果你發現自己在書面方式相同的代碼,並且,你可能需要編寫一個抽象。

在你的情況,你可以添加額外的方法到類,以及getParams(這大概只是返回的$_REQUEST內容),添加getParam()方法:

function getParam($key, $default=null) 
{ 
    return isset($_REQUEST[$key])? $_REQUEST[$key] : $default; 
} 

然後調用代碼變:

$someField = $this->getParam('someField', 'default value'); 

編輯,你還可以添加環衛調用此方法還有:

function getParam($key, $default=null) 
{ 
    return isset($_REQUEST[$key])? $this->sanitizeInput($_REQUEST[$key]) : $default; 
} 

更加減少調用代碼。現在,你不僅要有正確的錯誤免費的代碼,但是你已經減少您的調用代碼從三行:

$params = $this->getParams(); 

// This key may not exist --+ 
//       | 
//       v 
$someField = $params['someField'] ?: 'default value'; 
$someField = $this->sanitizeInput($someField); 

要一個:用`isset

$someField = $this->getParam('someField', 'default value'); 
+0

偉大的答案和例子。編程時做出任何假設通常都是一個壞主意。 – Phil