读书人

关于防止SQL流入攻击

发布时间: 2013-03-01 18:33:02 作者: rapoo

关于防止SQL注入攻击
初学asp.net,刚写了一段查询数据库的代码,写的过程中碰到不少问题,多亏有CSDN高手指点,现在终归是可以运行了。我想请教的是,如何优化代码,变的更高效,安全。还请高手指点。代码如下:
protected void Button1_Click1(object sender, EventArgs e)
{
this.Title="查询货物状态";
SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString);
sqlcon.Open();
string str_state="";
if (TextBox1.Text == "")
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<Script language='javascript' defer>alert('请输入订单号!');</Script>");
}
else
{
string tex1 = string.Format("SELECT COUNT(*) FROM 状态表 WHERE 订单号='{0}'", TextBox1.Text.Trim());
SqlCommand myComand = new SqlCommand(tex1, sqlcon);
int count = (int)myComand.ExecuteScalar();
if (count <= 0)
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<Script language='javascript' defer>alert('订单号有误!');</Script>");
}
else
{
str_state = "SELECT * FROM 状态表 WHERE 订单号=" + TextBox1.Text;
SqlDataAdapter sqlda = new SqlDataAdapter(str_state, sqlcon);
DataSet ds = new DataSet(); //声明一个dataset对象
sqlda.Fill(ds,"状态表");
GridView1.DataSource = ds;
GridView1.DataBind(); //绑定数据记录
sqlcon.Close();
}
}
} sql asp.net

[解决办法]
str_state = "SELECT * FROM 状态表 WHERE 订单号=" + TextBox1.Text

凡是sql这种写法的统统都改
str_state = "SELECT * FROM 状态表 WHERE 订单号=@订单号" ;
SqlCommand cmd = new SqlCommand(sql, conn);

SqlParameter sp = new SqlParameter("@订单号", textbox1.text);

cmd.Parameters.Add(sp);

try

{

conn.Open();

return (cmd.ExecuteNonQuery());

}

catch (Exception)

{

return -1;

throw;

}

finally

{

conn.Close();

}
[解决办法]
在.net中简单有效的防止sql注入的一种方法就是参数化查询

就像楼上所说的

还有建议LZ的表名称和字段名称最好用英文来表示,这样比较符合编码习惯,出错性也少

并且你的查询条数可以用

select count(primary key) from table
来查询条数,priary key是你主键的名称 这样的查询效率比你的高
[解决办法]
不会报错,但是会影响效率。

最好每张表都设上主键。查询效率会快很多
[解决办法]
是的主键的意义就是提供效率。

一般查询数字比字符串速度快。

主键更快
[解决办法]
返回关键字不能跟一个对象表达式

代码有错。
你是不是吧return (cmd.ExecuteNonQuery());
这个也抄上了。贴出代码来 瞅瞅
[解决办法]
return (cmd.ExecuteNonQuery());

把这个去掉,这个是执行insert update delete时用的,返回的是受影响的行数,

你select返回的是dataset 不一样。
[解决办法]
去了
protected void Button1_Click1(object sender, EventArgs e){。。。}

这里的void就是指无返回类型。

一般情况下方法分有返回类型跟无返回类型。
无返回类型是指直接处理数据,这里不允许出现return;
又反返回类型是指你在方法里处理了半天 把处理好的结果送出来。送出来的数据类型要对应好
protected int method(){...retrun 1;}
protected string method(){...retrun "abc";}
protected dataset method(){...
DataSet ds = new DataSet();
sqlda.Fill(ds, "状态表");
retrun ds;}
[解决办法]
SqlParameter sp = new SqlParameter("@huowuID", TextBox1.Text);
[解决办法]
SqlDataAdapter da = new SqlDataAdapter(str_state , conn);
SqlParameter sp = new SqlParameter("@huowuID", TextBox1);
da.SelectCommand.Parameters.Add(sp);


sqlda.Fill(ds, "状态表");

这样写,把 SqlCommand cmd = new SqlCommand(str_state, sqlcon);
SqlParameter sp = new SqlParameter("@huowuID", TextBox1);
cmd.Parameters.Add(sp);
注释了

再试试
[解决办法]
SqlCommand cmd = new SqlCommand(str_state, sqlcon);

留着。。。。
[解决办法]
用SqlDataAdapter 的时候。要在SqlDataAdapter 下面为参数赋值。

背下来就好了,国务院就这么规定的
[解决办法]
http://blog.csdn.net/yisuowushinian/article/details/7335413
[解决办法]
这些不用。这些相当于赋值,不会报什么意外的错误 你用多了就知道了

读书人网 >asp.net

热点推荐