asp.net 为什么在使用参数时出现SQL解析错误?

6yoyoihd  于 2022-12-05  发布在  .NET
关注(0)|答案(2)|浏览(166)

我正在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

mdfafbf1

mdfafbf11#

参数化SQL命令不接受表名或列名,因为这将允许潜在的SQL注入攻击。这是一项安全功能。
允许表单或请求中的表名和列名传递到SQL字符串中通常是一个不好的设计选择。
更好的方法是使用整数值并将这些值Map到其相应的表或列。
这样,您就可以避免,或者至少使恶意访问敏感数据的人更难访问这些数据,而这些数据本来就不应该通过请求或表单公开。

u5i3ibmn

u5i3ibmn2#

Try this:

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

相关问题