SQL漏洞注入是常见的一种攻击方式,我们可以通过一些简单的方式来预防。看一下我们经常写的代码:

   1: /// <summary>
   2: /// 不安全的登录代码
   3: /// </summary>
   4: /// <param name="sender"></param>
   5: /// <param name="e"></param>
   6: private void button2_Click(object sender, EventArgs e)
   7: {
   8:     string connString = "server=.;database=userinfo;uid=sa;pwd=123456";
   9:     using (SqlConnection conn = new SqlConnection(connString))
  10:     {
  11:         conn.Open();
  12:         string sql = string.Format("select * from userinfo where username = '{0}' and userpwd='{1}'", textBox1.Text, textBox2.Text);
  13:         using (SqlCommand cmd = new SqlCommand(sql, conn))
  14:         {
  15:             using (SqlDataReader reader = cmd.ExecuteReader())
  16:             {
  17:                 if (reader.Read())
  18:                 {
  19:                     MessageBox.Show("Success!");
  20:                 }
  21:                 else
  22:                 {
  23:                     MessageBox.Show("Error");
  24:                 }
  25:             }
  26:         }
  27:     }
  28: }

数据库的结构:

运行程序:

SQL漏洞注入:

方式一(知道用户名):

当在用户名文本框中输入 tom ’ -- 点击登录按钮:

原因是生成后的SQL成了如下形式:

   1: select * from userinfo where username = 'tom ' --' and userpwd=''

--是SQL中的注释

方式二(不知道用户名密码):

当在用户名文本框中输入 ' or 1=1 -- 点击登录按钮:

生成后的SQL:

   1: select * from userinfo where username = '' or 1=1 --' and userpwd=''

--依然是注释,但是or促成了1=1条件的永远成立。

预防方式一(使用带参数的SQl):

   1: /// <summary>
   2: /// 安全登录
   3: /// </summary>
   4: /// <param name="sender"></param>
   5: /// <param name="e"></param>
   6: private void button3_Click(object sender, EventArgs e)
   7: {
   8:     try
   9:     {
  10:         string connString = "server=.;database=userinfo;uid=sa;pwd=123456";
  11:         using (SqlConnection conn = new SqlConnection(connString))
  12:         {
  13:             conn.Open();
  14:             string sql = "select * from userinfo where username = @id and userpwd= @pwd";
  15:             using (SqlCommand cmd = new SqlCommand(sql, conn))
  16:             {
  17:                 cmd.Parameters.Add(new SqlParameter("@id", textBox1.Text));
  18:                 cmd.Parameters.Add(new SqlParameter("@pwd", textBox2.Text));
  19:                 using (SqlDataReader reader = cmd.ExecuteReader())
  20:                 {
  21:                     if (reader.Read())
  22:                     {
  23:                         MessageBox.Show("Success!");
  24:                     }
  25:                     else
  26:                     {
  27:                         MessageBox.Show("Error");
  28:                     }
  29:                 }
  30:             }
  31:         }
  32:     }
  33:     catch (Exception ex)
  34:     {
  35:         MessageBox.Show(ex.Message.ToString());
  36:        
  37:     }
  38: }

运行:

方式二(使用存储过程):

存储过程:

   1: create proc findUser
   2: @name nvarchar(50),
   3: @pwd nvarchar(50)
   4: as 
   5: select * from userinfo where username = @name and userpwd = @pwd

代码:

   1: /// <summary>
   2: /// 安全登录
   3: /// </summary>
   4: /// <param name="sender"></param>
   5: /// <param name="e"></param>
   6: private void button3_Click(object sender, EventArgs e)
   7: {
   8:     try
   9:     {
  10:         string connString = "server=.;database=userinfo;uid=sa;pwd=123456";
  11:         using (SqlConnection conn = new SqlConnection(connString))
  12:         {
  13:             conn.Open();
  14:             using (SqlCommand cmd = new SqlCommand("finduser", conn))
  15:             {
  16:                 cmd.CommandType = CommandType.StoredProcedure;
  17:                 cmd.Parameters.Add(new SqlParameter("@name", textBox1.Text));
  18:                 cmd.Parameters.Add(new SqlParameter("@pwd", textBox2.Text));
  19:                 using (SqlDataReader reader = cmd.ExecuteReader())
  20:                 {
  21:                     if (reader.Read())
  22:                     {
  23:                         MessageBox.Show("Success!");
  24:                     }
  25:                     else
  26:                     {
  27:                         MessageBox.Show("Error");
  28:                     }
  29:                 }
  30:             }
  31:         }
  32:     }
  33:     catch (Exception ex)
  34:     {
  35:         MessageBox.Show(ex.Message.ToString());
  36:        
  37:     }
  38: }

运行结果同上。

转载于:https://www.cnblogs.com/kay/archive/2009/01/07/1371463.html

关于SQL漏洞注入(Ado.Net)相关推荐

  1. sqlmap 进行sql漏洞注入

    有一款工具叫sqlmap主要用于识别sql漏洞并注入,这里我就写一篇教程教大家如何使用. 因为sql注入是非法的,所以我就使用两台自己的虚拟机进行测试,请大家不要在别人的网站上搞破坏.(现在大部分网站 ...

  2. JeecgBoot 2.x版本SQL漏洞补丁发布——响应零日漏洞修复计划

    漏洞编码:HW21-0499 产品名字:JeecgBoot低代码平台 问题: JEECG系统存在SQL注入0day漏洞 处理情况: 已经处理 处理方案: 针对存在SQL漏洞注入风险的接口,采用加签名认 ...

  3. 不为人知的动网7.1 SQL版注入漏洞

    文章难易度:★★★ 文章阅读点:动网7.1 SQL版最新注入漏洞的详细利用以及如何在后台获取Webshell 话说上期X档案刊登了动网8.0 SQL版最新注入漏洞的文章,不知大家都掌握了没有,令人兴奋 ...

  4. php sql漏洞修复,php sql注入漏洞与修复

    出于安全考虑,需要过滤从页面传递过来的字符. 通常,用户可以通过以下接口调用数据库的内容:URL地址栏.登陆界面.留言板.搜索框等. 轻则数据遭到泄露,重则服务器被拿下. 一.SQL注入的步骤 a) ...

  5. 墨者靶场-SQL手工注入漏洞测试(MySQL数据库-字符型)

    0x00 前言 我们都知道,SQL注入分数字型和字符型,我们上次讲的是最基本的数字型SQL注入,这次我们就来讲最基本的字符型SQL注入.同样,如果是明白原理和方法的话,看懂这篇文章并不难,但是如果不清 ...

  6. 墨者学院01 SQL手工注入漏洞测试(MySQL数据库)

    问题描述 鉴于我已经两周没能成功运行攻防世界的靶场环境...于是昨天又搜了一些网站,感觉墨者学院的题目还可以~ SQL手工注入虽然是一个已经被安全博主讲烂的主题,但是我之前很少有从头到尾实践手工注入的 ...

  7. SQL注入之什么是加密注入|二次漏洞注入|DNSlog注入

    加密注入.二次漏洞注入.DNSlog注入 加密注入: 什么是加密注入??下面将由一个例子阐述: 以sqlilabs-less-21为例 1.在登录界面输入账户密码提交抓包 2.在抓到这条数据,将uma ...

  8. SQL手工注入漏洞测试(Oracle数据库)

    SQL手工注入漏洞测试(Oracle数据库) 0x01前言 本文旨在讲述Oracle数据库多种情况下如何进行注入 靶场地址:SQL手工注入漏洞测试(Oracle数据库)_SQL注入_在线靶场_墨者学院 ...

  9. Oracle数据库注入-墨者学院(SQL手工注入漏洞测试(Oracle数据库))

    本期来为大家讲解的sql注入题目是来墨者学院的SQL手工注入漏洞测试(Oracle数据库). 地址:http://124.70.22.208:42948/new_list.php?id=1(注意地址已 ...

最新文章

  1. 没有添加跳新增,添加之后跳修改
  2. flex 字体加载方式4
  3. 畅想来自未来的便携扫描仪
  4. 愚人节整人软件测试自学,2020愚人节整蛊整人攻略大全
  5. Redis高频面试笔记:mysql8.0新特性
  6. ②你真的学会Java了吗?来自《卷Ⅰ》的灵魂提问
  7. Android 中文API (38) —— Spinner
  8. 力扣——206.反转链表
  9. 问题六十八:BRDF——(着色模型(shading model)(1)——反射模型(reflection model)(3.2))
  10. element的form表单中如何一行显示多el-form-item标签
  11. 7个Python实战项目代码,让你感受下大神是如何起飞的!
  12. Android 原生工程接入mPaas框架
  13. 李宏毅机器学习笔记【未完】
  14. 网络编程实验综合报告
  15. oracle 手动添加分区,Oracle 分区表怎么添加分区
  16. 实时视频带宽的计算过程
  17. 地铁AFC付出体式格局近况及移动付出安好性探究
  18. java的JVM虚拟机相关知识,简单易懂。
  19. 内存优化总结: ptmalloc、tcmalloc 和 jemalloc
  20. Quick BI 数据大屏快速入门

热门文章

  1. 大名鼎鼎的Requests库用了什么编码风格?
  2. python_day26__02__文件的传送
  3. Android之linux基础教学之八 内核同步介绍
  4. 算法---------前 K 个高频元素(Java版本)
  5. 滴滴面试算法-----有序二维数组查找
  6. android singleTop 不起作用
  7. Android 布局错乱 Android花屏
  8. android stadio svn 使用技巧
  9. Robolectric
  10. 浏览器URL地址里一堆%或者6E616D6531之类的是啥?编码