SQL语句的防溢出攻击写法 我认为是用存储过程以外,最好的sql语句在程序里的实现了 个人认为学会这个以后,可以完全放弃以前的 sql语句里嵌入空间的Text属性的写法 如: "select +'testbox1.Text' +from +'textbox2.Text'" 这种写法可读性非常差,在编写过程中常常会写错语法,而且会有被SQL溢出攻击的可能。
SQL的防溢出写法 如:
- protected void btn1_Click(object sender, EventArgs e)
- {
- string connstring = @"server=10.72.26.227;Database=BM_DATABASE;User ID=almj; Password=almj";
- using (SqlConnection conn = new SqlConnection(connstring))
- {
- conn.Open();
- using (SqlCommand sqlcom = new SqlCommand("insert into SHEQU_TABLE (USERNAME,TEL,PRO,JOB,CONT) values (@USERNAME,@TEL,@PRO,@JOB,@CONT)", conn))
- {
- sqlcom.Parameters.AddWithValue("@USERNAME", name.Text);
- sqlcom.Parameters.AddWithValue("@TEL", tel.Text);
- sqlcom.Parameters.AddWithValue("@PRO", pro.SelectedItem.Text);
- sqlcom.Parameters.AddWithValue("@JOB", job.Text);
- sqlcom.Parameters.AddWithValue("@CONT", cont.Text);
- sqlcom.ExecuteNonQuery();
- }
- }
- }
使用using () {}可以不用手动关闭数据库流(conn.Close();)using语句在代码块结束时会自动调用对象的Dispose()方法释放资源由于Command对象同样实现了Dispose()方法我们也可以同样适用using来自动释放资源,这也是微软官方推荐的最佳实践方法。
在程序中的(@USERNAME,@TEL,@PRO,@JOB,@CONT部分是SQL变量(我是这么叫的),我们要从控件的Text属性读取值并赋值给它,可以用下面的方法实现赋值 如:
- sqlcom.Parameters.AddWithValue("@USERNAME", name.Text);
- sqlcom.Parameters.AddWithValue("@TEL", tel.Text);
- sqlcom.Parameters.AddWithValue("@PRO", pro.SelectedItem.Text);
- sqlcom.Parameters.AddWithValue("@JOB", job.Text);
- sqlcom.Parameters.AddWithValue("@CONT", cont.Text);
- sqlcom.ExecuteNonQuery();
用SqlCommand的Parameters.AddWithValue()方法可以对SQL变量赋值(我是这么叫的)。这样就实现了SQL语句在程序中防溢出写法了。