我有来自其他项目的类,这些项目包含SQL查询字符串。
参见我的例子
public class OtherClass
{
myQuery = "SELECT * FROM v_My_View WHERE code = '@code'";
// I am targeting a view, not a stored procedure
}
我的问题是,如果我在我的commandText
中使用它并且只是用值替换@code
,这是针对SQL注入的有效参数吗?
如果SQL注入容易受到攻击 - 它的其他选择是什么?
我尝试使用
CMD.Parameters.AddWithValue("@code", _obj.code)
但它破坏了我的疑问。
我在访问存储过程时使用参数,但在访问我的视图时却没有。
这是我的主要内容:
public class Main
{
public DataTable myMethod()
{
try
{
DataTable myTable = new DataTable("MyDataTable");
using (SqlCommand CMD = new SqlCommand())
{
CMD.Connection = RBOSUtil.DBConnection();
CMD.CommandType = CommandType.Text;
// this is the part I used the string from other class
CMD.CommandText = OtherClas.myQuery.Replace("@code", _obj.code);
using (SqlDataAdapter DA = new SqlDataAdapter(CMD))
{
DA.Fill(myTable);
}
}
}
catch
{
throw;
}
finally
{
//close connection
}
return myTable;
}
}
答案 0 :(得分:2)
使用此
public class Main
{
public DataTable myMethod()
{
DataTable myTable = new DataTable("MyDataTable");
try
{
using (SqlCommand CMD = new SqlCommand())
{
CMD.Connection = RBOSUtil.DBConnection();
CMD.CommandType = CommandType.Text;
//this is the part I used the string from other class
CMD.CommandText = OtherClas.myQuery;
CMD.Parameters.Add("@code", SqlDbType.NVarChar).value = _obj.code;
using (SqlDataAdapter DA = new SqlDataAdapter(CMD))
{
DA.Fill(myTable);
}
}
}
catch
{
throw;
}
finally
{
//close connection
}
return myTable;
}
}
在尝试
之前声明数据表答案 1 :(得分:1)
SQL语句中的参数名称不需要引号:
myQuery = "SELECT * FROM v_My_View WHERE code = @code";
。否则你所做的一切对我来说都很好。它应该工作。
您应该使用SQL参数,例如Ravi答案中的代码,但您还需要修改查询以删除参数名称周围的引号。