2011-10-22 32 views
0

我已經做出了簡單和薄的數據庫層來幫助我正常運行。現在它正在起作用,我決定以安全方式審查它。第一次碰撞(with help of Mordred)是我的動態查詢。爲表的第一個問題變量很容易被驗證表變量對固定的正則表達式解析:動態查詢和安全選項

$regex = '/^[a-zA-Z0-9_$]+$/'; 

現在,下一個變量消毒/驗證是列名和AFAICS是我有兩個選擇。首先檢索該表中的所有列並構建白名單或再次使用正則表達式來驗證列變量。我的問題是,上述哪一項是一種方式?對錶名使用正則表達式驗證是否好?下面是我在談論

$stmt= $this->conn->prepare("SELECT * FROM $table WHERE $id_col[0]=:id");    
$stmt->execute(array(":id"=>$id_val[0])); 
$this->resultset = $stmt->fetch(PDO::FETCH_ASSOC); 

希望從你的朋友聽到一個樣本SQL字符串(很抱歉,如果問題是某處的回答。我找不到這種事情!)

回答

1

我做了什麼創建一個腳本來掃描所有表併爲表名和列創建白名單,然後使用它來驗證任何應該是表/列名的用戶輸入,因爲它們不會進入參數查詢。其他任何通過PDO綁定參數化!

-1
function escapeIdent($str) { 
    return "`".str_replace("`","``",$str)."`"; 
} 

但是,我會建議不要同時從其他答案逃脫和這樣的批量白名單。

白名單不應該在整個網站範圍內,而應該是針對它所使用的聲明。

雖然用戶提供的字段名稱可能不包含注入代碼,但仍然可能仍然存在一些危險。假設攻擊者設法用surname等一些無害的字段替換access level這類更重要的字段,他可以獲得該網站的管理員權限。