我正在使用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>
}
答案 0 :(得分:1)
参数化SQL命令不接受表名或列名,因为它允许潜在的SQL注入攻击。这是一个安全功能。
允许将表单或请求中的表名和列名传递给SQL字符串通常是一种糟糕的设计选择。
更好的方法是使用整数值并将它们映射到相应的表或列。
这样你就可以避免,或者至少让那些有恶意意图的人更难以访问从未打算通过请求或表单首先暴露的敏感数据。
答案 1 :(得分:0)
试试这个:
var result = db.Execute("UPDATE ["+tble+"] SET ["+field+"]=@1 WHERE ["+idName+"]=@2",value,id);