黑马程序员技术交流社区

标题: c#如何防止SQL注入攻击以及实现安全散列登陆 [打印本页]

作者: 冯华亮    时间: 2012-8-6 12:43
标题: c#如何防止SQL注入攻击以及实现安全散列登陆
注意我的sql版本是sql2005,系统是window xp,推荐大家使用测试工具是vs2008,如若不能执行,请把原因发给我 ,因为涉及GUI设计 ,所以有需要的同学可告知一声。
第一段是查询代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Data.SqlClient;
  10. using System.Security.Cryptography;
  11. namespace 散列安全登录
  12. {
  13.     public partial class Form1 : Form
  14.     {
  15.         
  16.         public Form1()
  17.         {
  18.             InitializeComponent();
  19.         }
  20.         SqlConnection conn;
  21.         SqlCommand cmd;
  22.         SHA1CryptoServiceProvider sha;
  23.         private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
  24.         {
  25.             Form f3 = new Form3();
  26.             f3.Show();
  27.         }

  28.         private void Form1_Load(object sender, EventArgs e)
  29.         {
  30.             try
  31.             {
  32.                 conn = new SqlConnection(Global.connstring);
  33.                 sha = new SHA1CryptoServiceProvider();
  34.             }
  35.             catch(Exception ex)
  36.             { MessageBox.Show("数据库连接失败"+ex.Message); }
  37.         }

  38.         private void button1_Click(object sender, EventArgs e)
  39.         {
  40.             cmd = new SqlCommand();
  41.             cmd.Connection = conn;
  42.             cmd.CommandType = CommandType.Text;
  43.             cmd.CommandText = "select count(*) from b where denglu=@denglu and password=@password";
  44.             byte[] data = Encoding.ASCII.GetBytes(textBox2.Text);
  45.             cmd.Parameters.Add("@denglu",SqlDbType.VarChar,10).Value=textBox1.Text;
  46.             cmd.Parameters.Add("@password",SqlDbType.Binary,50).Value= sha.ComputeHash(data);
  47.             conn.Open();
  48.             int result = (int)cmd.ExecuteScalar();
  49.             conn.Close();
  50.             if (result > 0)
  51.             {
  52.                 Form f2 = new Form2();
  53.                 f2.ShowDialog();
  54.             }
  55.             else
  56.             {
  57.                 MessageBox.Show("failure");
  58.             }
  59.             

  60.         }
  61.     }
  62. }
复制代码
第二段是散列登陆代码

    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }
        SqlConnection conn;
        SqlCommand cmd;
        private void Form3_Load(object sender, EventArgs e)
        {
            try
            {
                conn = new SqlConnection(Global.connstring);
               
            }
            catch (Exception ex)
            { MessageBox.Show("数据库连接失败" + ex.Message); }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //byte []salt=new byte[8];
            //RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
            //rng.GetBytes(salt);
            byte[] data = Encoding.ASCII.GetBytes(textBox2.Text);
            byte[] password;
            SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();
            password=sha.ComputeHash(data);
            data = Encoding.ASCII.GetBytes(textBox3.Text);
            if (Encoding.ASCII.GetString(password).Equals(Encoding.ASCII.GetString(sha.ComputeHash(data))))
            {
                cmd = new SqlCommand("insert into b values(@denglu,@password,@salt)",conn);
                cmd.Parameters.Add("@denglu", SqlDbType.Char,10).Value = textBox1.Text;
                cmd.Parameters.Add("@password", SqlDbType.Binary,50).Value = password;
                cmd.Parameters.Add("@salt", SqlDbType.Int, 4).Value = 4;
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
            }
            else
            {
                MessageBox.Show("两次输入的密码不一致","提示");
                textBox2.Text = "";
                textBox3.Text = "";
                textBox2.Focus();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }

作者: 许庭洲    时间: 2012-8-6 13:50
//变量替换原则防止SQL注入攻击
cmd.CommandText = "select count(*) from b where denglu=@denglu and password=@password";//尽可能全的过滤SQL敏感的语句
byte[] data = Encoding.ASCII.GetBytes(textBox2.Text);
cmd.Parameters.Add("@denglu",SqlDbType.VarChar,10).Value=textBox1.Text;//把数据库里面注入的字段替换掉
cmd.Parameters.Add("@password",SqlDbType.Binary,50).Value= sha.ComputeHash(data);//把数据库里面注入的字段替换掉

//变量替换原则防止SQL注入攻击
cmd = new SqlCommand("insert into b values(@denglu,@password,@salt)",conn);//尽可能全的过滤SQL敏感的语句
cmd.Parameters.Add("@denglu", SqlDbType.Char,10).Value = textBox1.Text;//把数据库里面注入的字段替换掉
cmd.Parameters.Add("@password", SqlDbType.Binary,50).Value = password;//把数据库里面注入的字段替换掉
cmd.Parameters.Add("@salt", SqlDbType.Int, 4).Value = 4;//把数据库里面注入的字段替换掉




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2