2011-07-14 58 views
1

我正在做一個PHP OO項目,並且長期以來一直在考慮將變量消毒的位置。使對象方法四處奔波,隨時準備大聲疾呼,進行衛生處理,或給編碼員一些自由和空間,以疏忽自己消化所有的數據,並使職能啞巴的執行者?何處包括數據清理。內部或外部對象函數?

哪一個是首選的OO符合方式?

class something 
{ 

    public function getCategoryByCID($cid) 
    { 
     if (!is_array($cid)) 
      $cid = (array)$cid; 

     $cid = implode("','", $cid); 
     $cid = sanitizemeHARD($cid); 

     $sql = "SELECT * FROM cat WHERE (cat_cid IN ('$cid'))"; 
     return $db->q($sql); 
    } 

} 


$c = new something(); 
$c->getCategoryByCID($_GET['cid']); 

OR 

$c = new something(); 

$cid = sanitizemeHARD($_GET['cid']); 
$c->getCategoryByCID($cid); //Of course in this case, the func doesn't have sanitization built in 

回答

1

它是您爲整個項目設定的政策問題。 我寧願遵循規則「過濾接收」 - 即在獲取外部數據的時候。

這樣可以避免數據可能經過的每個對象/方法的雙重消毒,並且還可以更容易地檢查整個代碼以進行正確的過濾。

所以,在你的例子中 - 第二種情況。

1

你需要讓編碼器照顧消毒的,因爲你不知道預期什麼類型的值呢,編碼器知道。

但是在您的示例中,您嘗試清理SQL語句中的字符串連接。你不應該那樣做,而是使用準備好的查詢。

+0

好的,你的需要是:外面。不關心這個例子。 – Jauzsika

+0

不,我的意思是:給編碼員提供易於使用的工具來進行驗證。不要試圖爲他們做。 – Jacco

1

我認爲首例(消毒功能)比較好。因爲:

  1. 您將會絕對確信數據已被清理。否則,您將需要檢查每個從數據可以傳遞的方式。
  2. 消毒是佔用CPU的時間,有些數據可以不使用(在if S,例如),所以你會清理數據,只有當它真的有必要,你會節省你的CPU時間:)
1

我會去與內部:

1)您可能需要打開一個Db連接來消毒,也許你在你的功能。 (但這取決於你的設計)。

2)該過程是自動化的。每次進行消毒時,您都不需要手動照顧。唯一一次你忘記消毒,可能是一個大問題。

相關問題