防止SQL注入攻击

时间:2022-03-13 15:03:05

    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