2010-07-30 54 views
2

本質上,我正在研究一個基於PHP的CMS,我正在爲插件基礎結構添加一個額外的安全層。目前,作者必須使用傳統方法來保護他們的SQL子句,這是沒有問題的。在特定條件下在MySQL WHERE子句中使用正則表達式

CMS接受單獨部分中的查詢,而WHERE子句是其中的一部分。作爲一個附加的安全層,我想要做的是在將WHERE子句添加到語句之前,讓系統快速執行正則表達式檢查以確保子句有效。

where子句是已經有它的公式用括號括起來,所以我想會做它只是確保...

  • 有報價以外的同等數量的括號

  • 有沒有掛引號

  • 第一托架是不是一個右括號

  • 最後括號不是一個左括號

  • 有任何意見

記住,這只是一個附加層的情況下,插件作者忘記了他的咖啡和不消毒他的投入。這聽起來像一個理智的解決方案?是否有任何類似於我所描述的正則表達式語句?這是我很糟糕的一件事。

+2

+1:消毒用戶提供的SQL不適合心靈的隱隱 – 2010-07-30 18:09:19

回答

0

我說,爲什麼不呢?腰帶和大括號離開!我仍然寧願提供一個API來讓他們部分或全部提交查詢。這將允許您使用參數化查詢(預準備語句)。

0

如果您正在討論檢測語法錯誤,這些查詢在解析時應該失敗並且永遠不會運行,所以數據是安全的。我懷疑你會找到一個正則表達式或其他工具,它和mysql本身一樣好,而且永遠不會給出錯誤的否定結果。你不應該更關心從MySQL返回有意義的調試錯誤消息嗎?

如果您擔心輸入未經處理,那麼您不能快速簡單地轉義參數。它只需要一個體面的函數來將任何 php變量轉換成安全的mysql文字。深入研究這些作者,他們必須使用的每個參數的該函數。例如db類方法:

final function esc($val) { 
    if ($val === null) 
     return 'NULL'; 
    if (is_bool($val)) 
     return $val ? 'TRUE' : 'FALSE'; 
    if (is_int($val) || is_float($val) || (is_string($val) && $val === (string) (int) $val)) 
     return $val; 
    if (is_object($val) || is_array($val)) 
     $val = serialize($val); 
    else 
     $val = (string) $val; 
    if (strlen($val)) { 
     if ($this->real_esc) 
      $val = mysql_real_escape_string($val, $this->cnn); 
     else 
      $val = mysql_escape_string($val); 
    } 
    return "'$val'"; 
} 

其中$this->real_esc = function_exists('mysql_real_escape_string');已經完成了性能。