2017-02-23 85 views
1

我正在研究Webmatrix中的數據庫應用程序。我有一個應該更新數據庫中的記錄的cshtml文件。如果我爲SQL命令使用字符串連接,一切正常,但我知道這並不安全。所以,我試圖改用參數。但是當我這樣做時,我得到了一個SQL解析錯誤。當我使用參數時,爲什麼會出現SQL解析錯誤?

作品:

@{ 
    string dbName = Request["db"]; 
    string tble = Request["t"]; 
    string idName = Request["idn"]; 
    string id = Request["id"]; 
    string field = Request["f"]; 
    string value = Request["v"]; 

    var db = Database.Open(dbName); 
    var result = db.Execute("UPDATE ["+tble+"] SET ["+field+"]='"+value+"' WHERE ["+idName+"]='"+id+"'"); 
    <text>Result: @result</text> 
} 

導致錯誤:

@{ 
    string dbName = Request["db"]; 
    string tble = Request["t"]; 
    string idName = Request["idn"]; 
    string id = Request["id"]; 
    string field = Request["f"]; 
    string value = Request["v"]; 

    var db = Database.Open(dbName); 
    var result = db.Execute("UPDATE @0 SET @[email protected] WHERE @[email protected]",tble,field,value,idName,id); 
    @*var result = db.Execute("UPDATE ["+tble+"] SET ["+field+"]='"+value+"' WHERE ["+idName+"]='"+id+"'");*@ 
    <text>Result: @result</text> 
} 

Error Message

+1

表和列名不能作爲參數傳遞 – Nino

+0

請不要這樣做!查詢是你自己的地方。您的查詢是在選擇新娘(或新郎,必須養成這種習慣)之前預訂婚禮的確切程序。 – bbsimonbb

+0

想要參數化表和列名稱通常是破損數據模型的標誌。相同「類型」的數據應該存儲在* one *表中的* one *列中,而不是分散在多個表和列中。通常情況下,您會發現您希望針對此數據編寫查詢,這些數據不是直接的,因爲數據是分散的(必須在查詢中重命名多個表和列)並且某些* data *已被嵌入放入這些表格和列*名*中,當它應該被建模*爲數據*時。 –

回答

1

參數化SQL命令不接受表或列的名稱,因爲它將使潛在的SQL注入攻擊。這是一項安全功能。

這通常是一個糟糕的設計選擇,它允許將來自表單或請求的表名和列名傳遞給SQL字符串。

更好的方法是使用整數值並將它們映射到它們對應的表或列。

通過這種方式,您可以避免或者至少使惡意企圖訪問敏感數據的人變得更加困難,因爲敏感數據本來無意通過請求或表單公開。

+0

這很有道理,謝謝! – Lemniscate

相關問題