• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ASP.NET防SQL注入方法のParameters属性传参 && LING技术

原作者: [db:作者] 来自: [db:来源] 收藏 邀请


 

在判断用户输入的用户名和密码是否和数据库中的相同时,更需要注意的就是SQL注入式攻击,

SQL注入式攻击是指利用设计上的漏洞,在目标服务器上运行SQL命令以及进行其他方式的攻击。

下面是一个简单的例子:

在登录的时候,我在用户名一栏输入℉бrrest,那么所执行的SQL语句就是:

SELECT COUNT(*) FROM db_student WHERE StuUserName='℉бrrest';

通过上面的语句可以在数据库中查询中一条StuUserName字段名为℉бrrest的用户信息,

但是如果我在文本框中输入℉бrrest or ’1′=’1′,

这样我们再来执行SQL语句:

SELECT COUNT(*) FROM db_student WHERE StuUserName='℉бrrest' OR '1'='1';

这样一条SQL语句就能够查找出db_student表中的所有记录,这就是传说中的SQL注入。

接下来介绍两种防止SQL注入式攻击的方法:

方法一、使用SqlCommand.Parameters属性传参过滤非法字符。一个简单登录页面事例代码:

            SqlConnection Con = new SqlConnection(ConfigurationManager.AppSettings["conStr"]);//连接字符串
            Con.Open();//打开数据库
            string strlogin = "select count(*) from tb_student where StuUsername=@name and StuPassword=@pwd";
            SqlCommand com = new SqlCommand(strlogin, Con);//创建SqlCommand对象
 
            com.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar, 50));//设置参数名,类型,长度
            com.Parameters["@name"].Value = TextBox1.Text;//设置参数值
            com.Parameters.Add(new SqlParameter("@pwd", SqlDbType.NVarChar, 50));
            com.Parameters["@pwd"].Value = TextBox2.Text;
 
            if (Convert.ToInt32(com.ExecuteScalar()) > 0)
            {
                Response.Write("<script>alert('登录成功!')</script>");
                Response.Redirect("stu_award.aspx");
            }
            else
            {
                Response.Write("<script>alert('用户名或密码错误,请重新输入!')</script>");
                TextBox1.Text = "";
                TextBox2.Text = "";
                TextBox3.Text = "";
            }

方法二、使用LING防止SQL注入式攻击

LING to SQL在用户数据存取时,清除了SQL注入式攻击的存在,LING在每次执行查询时都加上了具体的参数,

例如我依然是在文本框中输入℉бrrest or ’1′=’1′,则LING会产生以下语句:

SELECT [t0].[StuUserName],[t0].[StuPassword],
 
FROM [dbo].[tb_student] AS [t0]
 
WHERE [t0].[StuUserName]=@p0

可以看出,WHERE子句被自动加上了参数,跟第一种方法原理类似,下面是一段事例代码:

protected void Button1_Click(object sender, EventArgs e)
    {
        string name = TextBox1.Text;//获取登录名
        string pass = TextBox2.Text;//获取密码
        LinqDataDataContext ldc=new LinqDataDataContext();//创建LINQ对象
        //创建LINQ查询语句,查询到满足指定登录名和密码的用户
        var result = from v in ldc.userManage
                     where v.StuUsername == name && v.StuPassword == pass
                     select v;
        if (result.Count() > 0)//查询到指定用户
        {
            RegisterStartupScript("", "<script>alert('登录成功!')</script>");
        }
        else   //未查询到指定用户
        {
            RegisterStartupScript("", "<script>alert('登录失败!')</script>");
        }
    }
 
 
 

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
解决ASP.NET的进程帐户没有访问IIS的权限发布时间:2022-07-10
下一篇:
ASP.NET Core 数据保护(Data Protection)【上】发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap