大多数时候我使用存储过程访问数据,但有时我会使用我认为不易受SQL注入攻击的语句。
以下是我使用的示例
protected void Page_Load(object sender, EventArgs e)
{
try
{
int CatID = Request["CatID"];
if (!IsPostBack)
{
getDetails(CatID);
}
}
catch (Exception ex)
{
Response.Write(ex.Message.ToString());
}
}
private DataTable getDetails( int CatID)
{
try
{
DataSet ds = new DataSet();
string strSql = "SELECT * FROM TableXYZ WHERE CatID = "+CatID ;
ds = DataProvider.Connect_Select(strSql);
DataTable dt = ds.Tables[0];
return dt;
}
catch (Exception ex)
{
throw;
}
}
我过滤输入或查询字符串,然后调用getDetails
函数并将CatID
作为参数传递给函数&然后到SQL语句。由于这是一个整数类型数据,这段代码是否容易受到SQL注入?
我想清除我的怀疑,以便我不会像这样使用SQL语句。
答案 0 :(得分:4)
当然,直接格式化查询字符串不是一个好习惯。 SqlParameter class是出于您的目的而设计的 - 简化查询构建并完全防止SQL注入
答案 1 :(得分:4)
由于CatID是int
,不,在这种情况下,您不容易受到SQL注入攻击。但是你选择的路径是滑坡,有一天,在重构或更改代码时,容易出现SQL注入。养成使用参数化查询并坚持使用它的习惯更好。
我可以完全建议你尝试Dapper(可以作为Nuget包使用(;这将大大简化事情,你不必为了它的好处而改变那么多。
您的代码将变成类似:
myConnection.Query<Customer>("SELECT * FROM TableXYZ WHERE CatID = @catid", new { catid = CatID });