SQL注入攻击是比较常见的一种攻击数据库的方法。在这种攻击中,用户常常利用SQL语句中的特定字符来创建一个恒等条件或永真条件,,从而使得网络应用程序不按照程序员事先设定的方式运行。这样一来,用户可以对网络应用程序进行非法操作,如访问网络应用程序数据库。
下面我们以一个例子来介绍防止SQL注入攻击的方法,同时还提供了防止SQL注入攻击的实例:
首先我们创建一个页面 SqlSecurity.aspx
其HTML设计代码如下:<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SqlSecurity.aspx.cs" Inherits="SqlSecurity" StyleSheetTheme="Aspnet3DBWeb" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>防止SQL注入攻击</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table>
<tr>
<td>用户名称:</td>
<td><asp:TextBox ID="tbUserName" Runat="server" Width="150"></asp:TextBox></td>
</tr>
<tr>
<td>用户密码:</td>
<td><asp:TextBox ID="tbPassword" Runat="server" Width="150" TextMode="Password"></asp:TextBox></td>
</tr>
<tr>
<td align="center" colspan="2"><asp:Button Runat="server" ID="btnLogin" Text="登录"
Width="60px" onclick="btnLogin_Click"></asp:Button></td>
</tr>
<tr>
<td colspan="2">
<asp:Label ID="lbSQL" runat="server" ForeColor="Red"></asp:Label>
<asp:Label id="lbLoginMsg" runat="server" Width="100%" ForeColor="Red"></asp:Label></td>
</tr>
</table>
</div>
</form>
</body>
</html>
其后台代码如下:using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;
///引入新的命名空间
using System.Data.SqlClient;
using ASPNET3DBBook;
public partial class SqlSecurity : System.Web.UI.Page
{
private string Login(string username,string password)
{ ///创建保存用户ID的变量
string userId = "";
///创建连接
SqlConnection myConnection = new SqlConnection(ASPNET3DBBookSystem.DBCONNECTIONSTRING);
///创建SQL语句
String cmdText = "SELECT ID FROM [User] WHERE Username='" + username
+ "' AND Password='" + password + "'";
///创建执行SQL语句的命令
SqlCommand myCommand = new SqlCommand(cmdText,myConnection);
///打开数据库的连接,并执行查询操作
myConnection.Open();
SqlDataReader recu = myCommand.ExecuteReader();
if(recu.Read())
{ ///获取用户的ID值
userId = recu["ID"].ToString();
}
recu.Close();
myConnection.Close();
///显示SQL语句
lbSQL.Text = cmdText;
lbSQL.Visible = true;
return (userId);
}
protected void btnLogin_Click(object sender,EventArgs e)
{ ///判断用户的输入
if(tbUserName.Text.Trim().Length <= 0 || tbPassword.Text.Trim().Length <= 0)
{
lbLoginMsg.Text = "用户名称或密码为空,请重新输入!!!";
return;
}
///检查用户输入的名称和密码是否正确,并实现登录
if(Login(tbUserName.Text.Trim(),tbPassword.Text.Trim()).Length > 0)
{
lbLoginMsg.Text = "用户登录成功!";
}
else
{
lbLoginMsg.Text = "用户登录失败,请重新登录!";
}
}
}
运行该网页 在用户名和用户密码中分别输入“aa”和“aa' or 'w'='w” 然后单击确定按钮,此时就构成了一个永真的SQL语句 (SELECT ID FROM [User] WHERE Username='aa' AND Password='aa'or'w'='w'),这样一来用户可以登陆成功然后对网络应用程序进行非法操作。
解决方法 可以通过存储过程避免SQL注入攻击
更多的有关信息 请参考http://www.secnumen.com/technology/anquanwenzhai.htm