天天看点

C# 使用参数化SQL语句(防SQL注入攻击)

“SQL注入攻击”问题。我们在程序中存在着大量拼接产生SQL语句的代码,这就会导致一个比较大的安全隐患,容易遭受SQL注入攻击。我们在代码中用的SQL语句是:

string sqlStr = "select * from [Users] where UserName='" + txtUserName.Text.Trim()                  
		+ "'and Password='" + txtUserPassword.Text.Trim() + "'";
           

在用户名、密码框中输入1‘ or ‘1’=1’后产生的SQL语句为:

而‘1’=‘1’永远是正确的。这样,用户在不知道合法的用户名和密码的情况下,通过构造特殊的SQL语句,就顺利地进入了系统,导致我们的用户验证模块形同虚设!为了避免这种情况的发生,提高程序的安全性,需要使用参数化SQL语句。

在ADO.NET对象模型中执行一个参数化查询,需要向SqlCommand对象的Parameters集合添加SqlParameter对象。生成SqlParameter对象最简单的方式是调用SqlCommand对象的Parameters集合的AddWithValue方法。

这里又学习了一个新的对象:SqlParameter,表示SqlCommand的参数。

使用参数化SQL语句的步骤是:

定义包含参数的SQL语句,用@符号声明参数。为SQL语句中出现的每一个参数定义参数对象,并将参数对象加入到SqlCommand对象中。给参数赋值,并执行SQL语句。所以,修改上面的代码为:

然后创建命令对象的代码时,修改为:

SqlCommand cmd = new SqlCommand(sqlStr,conn);
cmd.Parameters.AddWithValue("@UserName",txtUserName.Text.Trim());
cmd.Parameters.AddWithValue("@Password",txtUserPassword.Text.Trim());
           

现在,再次运行程序,在用户名和密码框中都输入‘1 or ’1‘=1’后,会提示“用户名或密码错误”,这样用户就没有办法非法登录系统了。

实例: C#语言Winform防SQl注入做用户登录的例子

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace OmyGod
{
    public partial class Form1 : Form
    {
        private static string connectionString = "Data Source=.;Initial Catalog=Omy;Integrated Security=True";
        public Form1()
        {
            InitializeComponent();
        }
        enum message
        {
            用户名或者密码输入错误 = 1,
            登录成功 = 2,
        }
        public bool check(string name, string pass)
        {
            using (SqlConnection
                conn = new SqlConnection(connectionString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandText = "select * from auser where name = @name and pass = @pass";
                cmd.Parameters.AddRange(
                  new SqlParameter[]{
                  new  SqlParameter("@name",SqlDbType.VarChar){Value=this.name.Text},
                  new SqlParameter("@pass",SqlDbType.VarChar){Value=this.pass.Text},
             });
                cmd.ExecuteNonQuery();
                SqlDataAdapter ada = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                ada.Fill(ds);
                //return ds;
                DataSet data = ds;
                if (data.Tables[0].Rows.Count == 0){
                    MessageBox.Show((message.用户名或者密码输入错误).ToString());
                }else{
                    index mm = new index();
                    mm.Show();
                    this.Hide();
                    //  MessageBox.Show((message.登录成功).ToString());
                }
                return false;
            }
        }
        //用户登录
        private void button1_Click(object sender, EventArgs e)
        {
            string name = this.name.Text;
            string pass = this.pass.Text;
            check(name, pass);
        }
        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}