C# 从querystring读取SQL列名并从中构建安全查询

C# 从querystring读取SQL列名并从中构建安全查询,c#,sql,security,ado.net,C#,Sql,Security,Ado.net,我正在C#/.NET2.0中构建一个页面,在SQL调用中动态更新不同的列,例如: myajaxpage.aspx?id=1111&fieldname=title 构建SQL查询以从querystring读取列名的正确方法是什么?首先,这是一个好方法吗 我试过: cmd.CommandText = "UPDATE MyTable SET +"Request.QueryString["fieldname"]"+ = @fieldvalue WHERE id = @id"; 它可以工作但不安全,您能

我正在C#/.NET2.0中构建一个页面,在SQL调用中动态更新不同的列,例如: myajaxpage.aspx?id=1111&fieldname=title

构建SQL查询以从querystring读取列名的正确方法是什么?首先,这是一个好方法吗

我试过:

cmd.CommandText = "UPDATE MyTable SET +"Request.QueryString["fieldname"]"+ = @fieldvalue WHERE id = @id";

它可以工作但不安全,您能建议如何使此查询安全吗?

一点也不,您必须有一个可能列的列表,除非用户可以输入他们想要的任何内容

var possibleColumns = New List<String>; // add pssobile columns here
if (possibleColumns.Contains(Request.QueryString["fieldname"])
   cmd.CommandText = "UPDATE MyTable SET +"Request.QueryString["fieldname"]"+ = @fieldvalue WHERE id = @id";
else
   Response.Write(" invalid query ");
var-possibleColumns=新列表;//在此处添加PSMobile列
if(可能的列包含(Request.QueryString[“fieldname”])
cmd.CommandText=“UPDATE MyTable SET+”请求.QueryString[“fieldname”]”+=@fieldvalue,其中id=@id”;
其他的
响应。写入(“无效查询”);

使用SQL存储过程而不是特殊的SQL语句。

绝对不要像那样在SQL中附加querystring参数。如果要这样做,请支持“友好”列表查询字符串中的列名,然后将其映射到表中的实名字段,这样你就不会向外部世界暴露你的实际模式了。

首先,考虑是否有另一种方式来做这件事:暴露实际列名可能是个坏主意。现在恶意用户只需要做的工作就少了。>

这样的话,我会考虑验证你对预期值列表的输入。如果FieldNew的值是你不期望的,你应该在到达数据库层之前中止它。

最后,您应该考虑使用方括号引用字段名。如果在输入中找到一个封闭的方括号,则用双闭方括号替换它:

[this [should]] be a valid name too]

您应该将字段名从querystring altogehter中抽象出来。querystring可以包含一些表示字段的标识符,但没有理由在服务器外部公开数据库布局的详细信息


来自浏览器的任何内容都不应在未经验证的情况下直接用于查询。您必须验证字段名是否是允许更改的字段之一,因此将独立标识符转换为实际字段名的工作量大致相同。

只是好奇:字段名是如何选择的?我正在尝试o构建就地编辑脚本it jQuery。名称来自CSS类。