为什么我使用参数时会出现 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);
我正在 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);