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

Why do I get an SQL parsing error when I use parameters?

我正在 Webmatrix 中开发数据库应用程序。我有一个 cshtml 文件,它应该更新数据库中的记录。如果我对 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 @1=@2 WHERE @3=@4",tble,field,value,idName,id);
    @*var result = db.Execute("UPDATE ["+tble+"] SET ["+field+"]='"+value+"' WHERE ["+idName+"]='"+id+"'");*@
    <text>Result: @result</text>
}

Error Message

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

允许将表单或请求中的 table 和列名称传递到 SQL 字符串通常是一个糟糕的设计选择。

更好的方法是使用整数值并将其映射到相应的 table 或列。

这样您就可以避免或至少让怀有恶意的人更难访问敏感数据,而这些数据本来就不会通过请求或表单公开。

试试这个:

var result = db.Execute("UPDATE ["+tble+"] SET ["+field+"]=@1 WHERE ["+idName+"]=@2",value,id);