当我使用参数时,为什么会出现SQL解析错误?

问题描述:

我正在研究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 *已被嵌入放入这些表格和列*名*中,当它应该被建模*为数据*时。 –

参数化SQL命令不接受表或列的名称,因为它将使潜在的SQL注入攻击。这是一项安全功能。

这通常是一个糟糕的设计选择,它允许将来自表单或请求的表名和列名传递给SQL字符串。

更好的方法是使用整数值并将它们映射到它们对应的表或列。

通过这种方式,您可以避免或者至少使恶意企图访问敏感数据的人变得更加困难,因为敏感数据本来无意通过请求或表单公开。

+0

这很有道理,谢谢! – Lemniscate

试试这个: var result = db.Execute("UPDATE ["+tble+"] SET ["+field+"][email protected] WHERE ["+idName+"][email protected]",value,id);