2012-08-03 51 views
1

下面是一個SQL查詢正在使用正則表達式來檢查數據庫包裝器矯枉過正的列嗎?

public function where ($col, $val) 
{ 
    if (!preg_match('~^[a-z0-9_]+$~i', $col)) 
     throw new Exception('Invalid parameter $col'); 

    $this->where.= "WEHERE $col = :$col"; 
} 

爲例包裝,因爲正則表達式是可能使用資源,這是相當矯枉過正。 注意我實際上使用它來包裝PDO(請注意冒號:$ col)。

回答

1

如果$col可以通過用戶輸入指定,那麼這不是過度殺傷,而是您的唯一防禦針對SQL注入。

如果$col已知安全(例如,您的代碼通過switch語句產生其值),那麼包含運行時檢查可能不值得。但是,您應該考慮到隨着該計劃在未來的維護中「已知安全」狀態發生變化的可能性。

+0

SQL注入預防是一個相當不好的例子,因爲您應該使用mysqli或類似的預備語句庫。 對字符串數據進行最後的完整性檢查以查看是否例如主要是有用的。在您點擊數據庫之前,用戶傳遞的電話號碼將處於預期的格式。 – JBert 2012-08-03 11:56:06

+0

@JBert:我假設你要麼沒有仔細閱讀這個問題(使用PDO),要麼掩蓋了綁定*值*與預處理語句和綁定*模式對象名稱*之間的區別*(這在所有AFAIK中是不可能的)。 – Jon 2012-08-03 12:02:26

+0

對不起,請忽略我的評論(一定是我的大腦關閉了)。我討厭看到應用程序在哪裏用戶需要輸入列名... – JBert 2012-08-03 12:14:48

相關問題