实例演示参数化查询防止 SQL 注入

写在前面

SQL 注入的危害就不用我多说了,之前也有文章从攻的层面写过关于此的。今天主要是从防的层面来写这篇文章。本篇从两个角度来防止SQL注入,前端验证用户输入,后端做参数化查询。

前端验证用户输入

其实这个属于自慰型的,实际上并不能做到防止SQL注入,只是给那些想要搞事情的瓜娃子警告。

1
2
3
4
5
6
7
8
9
10
11
12
<script>
function Verify() {
// alert("233");
var columns = document.getElementById("TextBox1").value;
//alert(columns);
var re =/(.*)(select|and|--|'|union|insert|delete%20from|count\(|drop%20table|update%20truncate%20|asc\(|mid\(|char\(|xp_cmdshell|exec%20master|net%20localgroup%20administrators|\"|:|net%20user|\|%20or%20)(.*)$/gi;
var e = re.test(columns);
if (e)
alert("请勿尝试非法注入!");
}
</script>

我这里只是验证的是一个文本框,如果做网站的话,肯定是验证URL后面的参数的,网上一大堆,原理类似。

后端参数化查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString = "integrated security=SSPI;data source=\"(local)\"; persist security info=False; initial catalog= MyDatabase ";
myConnection.Open();
// SQL拼接查询
string sql = "select 员工编号,姓名,性别,出生日期,基本工资 from MyTable2";
if (TextBox1.Text != "")
//sql += " where 姓名 = '"+ TextBox1.Text +" and MyTable1.编码=MyTable2.单位编码'";
sql += " where 姓名 = '" + TextBox1.Text + "'"; //where前面要加空格,同时TextBox1.Text被当做字符串处理,所以要使用+来连接该SQL查询语句。
// else
// Response.Write("<script>alert('2333');</script>");
// 参数化查询
string namevalue = TextBox1.Text;
SqlCommand search = new SqlCommand("select 员工编号,姓名,性别,出生日期,基本工资 from MyTable2 where 姓名=@name");
search.Connection = myConnection;
search.Parameters.AddWithValue("@name",namevalue);
// SqlDataReader reader = search.ExecuteReader();
// reader.Read();
SqlDataAdapter da = new SqlDataAdapter(search);
//创建数据适配器
DataSet ds = new DataSet();
da.Fill(ds);
//使用数据适配器的Fill方法将所需数据填充到数据集
GridView1.DataSource = ds;
GridView1.DataBind();
// myConnection.close();
}

这里注释的很详细了,SQL拼接查询也在上面,自己对比一下就很能说明问题了。最后放上女神,不多逼逼( 逃

我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?