利用“参数赋值”防范SQL注入漏洞攻击

<<年轻,无权享受》————送给每一个看到此文的同僚们

在这无精打采的炎夏

我躺在阳台上房东的旧沙发

回想几个月来遇到的问题

我不禁内心开始慌张喘着粗气

还有大把时间去打拼 没有到只能总结过去的年纪

我可不想现在是束缚的 我了解自己应该是自由的

美好都被我亲手搞砸 我明白我没有时间贪去挥霍了

我可不想老了以后 自己是孤独的

年少的时候 没理由去享受

等到你老了 头发掉落了

牵着老伴 坐在公园的长凳 静看人闲花落;

————————————————————————————————————————————————————————————————————————

冗言不再赘述了,直接开拔进入我们今天的主题

先不讲原理,首先我给大家引出一个经典案例,利用sql语句我们来实现注册和登陆的窗体应用程序,两个窗体应用程序做好之后,我们来运行看看到底程序存在哪些漏洞,我们先点击“注册”结果如图所示:

 

再点击 登陆按钮 结果如图所示:

 

我们会惊奇的发现注册时不输入字符,也能注册成功;登录时我们没有输入数据库里保存的账户和密码,而是输入hello' or 1=1 --  却也能登陆成功。看到这,你们当中有人肯定会说。这有什么好奇怪的,你给他们的属性设置为null了吗?但是我要跟你们说得是,其实不然,我们知道这样的结果并不是我们想要的,那如何去解决呢?有人会说这容易,去判断就行了呀?然而事实果如你说的容易吗?数据库是海量存储的,里面的数据包罗万象,按照你的做法你要去一个个判断,那得判断到何年马月啊?这就是我们看到的SQL注入的漏洞攻击,所以在这里就要引出我们今天的话题,如何来绕过SQL注入的漏洞攻击呢?

好了,接下来我们就要运用“参数赋值”的方法来防范SQL注入漏洞攻击:语法:运用@+参数 (@表示在SQL语句中申明一个变量来替代),SqlParameter

具体注册代码如下所示:

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

namespace 登录注册
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
       
        private void btnReg_Click(object sender, EventArgs e)
        {
            //object num=100;
            //SqlParameter sp=(SqlParameter)num;
         
            string connStr = "Data Source=.;Initial Catalog=MySchoolMoreData;Integrated Security=True";
        
            using(SqlConnection conn=new SqlConnection(connStr))
            {
 
                conn.Open();
             
                string sql = "insert into [user] values(@name,@pwd,@email,@phone)";

                //SqlParameter就是我们需要运用到的关键字,通过它我们对参数赋值;注意他返回的是一个数组 所以我们要用数组对象来接收
//@ 可写可不写 SqlParameter[] ps = { new SqlParameter("name",txtName.Text.Trim()), new SqlParameter("pwd",txtPwd.Text.Trim()), new SqlParameter("email",string.IsNullOrEmpty(txtEmail.Text.Trim())?DBNull.Value:(object)txtEmail.Text.Trim()), new SqlParameter("phone",string.IsNullOrEmpty(txtPhone.Text.Trim())?DBNull.Value:(object)txtPhone.Text.Trim()) }; SqlCommand command = new SqlCommand(sql, conn); command.Parameters.AddRange(ps); int num = command.ExecuteNonQuery(); MessageBox.Show(num == 1 ? "ok" : "no ok"); } } private void btnLog_Click(object sender, EventArgs e) { FrmLogin frm = new FrmLogin(); frm.Show(); } } }

 登陆事件代码如图:

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

namespace c01作业_登录注册
{
    public partial class FrmLogin : Form
    {
        public FrmLogin()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
      
            string connStr = "Data Source=.;Initial Catalog=MySchoolMoreData;Integrated Security=True";
       
            using (SqlConnection conn = new SqlConnection(connStr))
            {
              
                conn.Open();
                //1.创建命令语句 .使用了参数占位。以后服务器在执行这条sql命令的时候,就需要你也传递了对应名称的参数

                string sql = string.Format("select COUNT(*) from [User] where UserName=@name and Pass=@pwd");

                //2.创建出对应的参数,以后服务器执行命令的时候,会来找@name参数值

                SqlParameter p = new SqlParameter("@name", txtName.Text.Trim());

                //@可以省略,名称也不区分大小写,但是字符的组成要一样

                SqlParameter p2 = new SqlParameter("pwd",txtPwd.Text.Trim());

                //创建命令对象

                SqlCommand command = new SqlCommand(sql, conn);

                //3.同时需要将配套的参数对象传递给服务器来使用

                command.Parameters.Add(p);
                command.Parameters.Add(p2);
                
          
                int num=Convert.ToInt32(command.ExecuteScalar());
                //判断
                if (num > 0)
                {
                    MessageBox.Show("登录成功");
                }
                else
                {
                    MessageBox.Show("登录失败");
                }
            }
        }
    }
}

 使用参数赋值方法后就可以防范SQL注入的漏洞攻击了,当我们再次输入空字符的时候就会报如下错误:

posted @ 2014-06-06 23:52  葫芦里面有名堂  阅读(635)  评论(1编辑  收藏  举报