本文介绍了在设计QQ登录和注册页面时如何有效防止SQL注入攻击的方法和技术,增强网站安全性。
本人自己制作的登录与注册页面包含SQL防注入功能以及网页查询、插入更新数据库等功能,并且包含了省市三级联动及GridView使用的详细资料。文件大小为2.99 MB (3,143,053 字节),解压后大小为8.04 MB (8,431,678 字节)。
以下是部分代码示例:
### 省市三级联动
```xml
```
### SQL防注入
在全局应用程序类中添加如下代码:
```csharp
void Application_BeginRequest(object sender, EventArgs e)
{
//定义SQL关键词列表,用于过滤敏感字符串。
string Sql = and|or|exec|insert|select|delete|update|count|char|truncate|declare|drop|create;
//将所有可能的攻击字符进行分割
string[] sql_c = Sql.Split(|);
if (Request.QueryString != null)
{
foreach (string sl in sql_c)
{
if(Request.QueryString.ToString().IndexOf(sl.Trim()) >= 0)//查询字符串与敏感字符比较,如果匹配则记录IP地址并停止执行。
{
Response.Write(警告!你的IP地址: + Request.ServerVariables[Remote_Addr] +已经被记录!不要使用敏感字符!);
//获取攻击方的 IP 地址
System.IO.StreamWriter sw = new System.IO.StreamWriter(@c:\a.txt);
sw.Write(DateTime.Now.ToString() + IP地址
+ Request.ServerVariables[Remote_Addr]
+ 对网站进行SQL攻击);
sw.Close();
Response.End(); //停止该页执行
}
}
}
}
```
### 存储过程示例:
```sql
CREATE PROCEDURE Pro_Login @sno char(5),@password char(20) AS
select sno from users where sno=@sno and password=@password
GO
CREATE PROCEDURE Pro_Score @sno char(5)
AS select sno,cno,scgrade from sc where sno=@sno
GO
```
### Default1页面中Button点击事件代码:
```csharp
protected void Button1_Click(object sender, EventArgs e)
{
string str = server=.;Integrated Security=true;DataBase=student;
using (SqlConnection sqlconn = new SqlConnection(str))
{
try
{
sqlconn.Open();
SqlCommand cmd = new SqlCommand(Pro_Login,sqlconn);
cmd.CommandType=CommandType.StoredProcedure;
SqlParameter parm1 = new SqlParameter(@sno, SqlDbType.Char, 5);
SqlParameter parm2 = new SqlParameter(@password, SqlDbType.Char, 20);
parm1.Direction = ParameterDirection.Input;
parm2.Direction = ParameterDirection.Input;
parm1.Value = TextBox1.Text;
parm2.Value = TextBox2.Text;
cmd.Parameters.Add(parm1);
cmd.Parameters.Add(parm2);
SqlDataReader dr=cmd.ExecuteReader();
if (dr.Read())
{
Session[username] = TextBox1.Text;
Response.Redirect(Default2.aspx?sno= + TextBox1.Text );
}
else
Response.Write(用户名或密码错误);
}
catch(Exception ex) {Response.Write(ex.Message);}
}
}
```