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

在这无精打采的炎夏

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

回想几个月来遇到的问题

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

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

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

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

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

年少的时候 没理由去享受

等到你老了 头发掉落了

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

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

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

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

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

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

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

具体注册代码如下所示:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Data.SqlClient;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11.  
  12. namespace 登录注册
  13. {
  14. public partial class Form1 : Form
  15. {
  16. public Form1()
  17. {
  18. InitializeComponent();
  19. }
  20.  
  21. private void btnReg_Click(object sender, EventArgs e)
  22. {
  23. //object num=100;
  24. //SqlParameter sp=(SqlParameter)num;
  25.  
  26. string connStr = "Data Source=.;Initial Catalog=MySchoolMoreData;Integrated Security=True";
  27.  
  28. using(SqlConnection conn=new SqlConnection(connStr))
  29. {
  30.  
  31. conn.Open();
  32.  
  33. string sql = "insert into [user] values(@name,@pwd,@email,@phone)";
  34.  
  35. //SqlParameter就是我们需要运用到的关键字,通过它我们对参数赋值;注意他返回的是一个数组 所以我们要用数组对象来接收
    //@ 可写可不写 SqlParameter[] ps = {
  36. new SqlParameter("name",txtName.Text.Trim()),
  37. new SqlParameter("pwd",txtPwd.Text.Trim()),
  38. new SqlParameter("email",string.IsNullOrEmpty(txtEmail.Text.Trim())?DBNull.Value:(object)txtEmail.Text.Trim()),
  39. new SqlParameter("phone",string.IsNullOrEmpty(txtPhone.Text.Trim())?DBNull.Value:(object)txtPhone.Text.Trim())
  40. };
  41.  
  42. SqlCommand command = new SqlCommand(sql, conn);
  43. command.Parameters.AddRange(ps);
  44.  
  45. int num = command.ExecuteNonQuery();
  46.  
  47. MessageBox.Show(num == 1 ? "ok" : "no ok");
  48. }
  49. }
  50.  
  51. private void btnLog_Click(object sender, EventArgs e)
  52. {
  53. FrmLogin frm = new FrmLogin();
  54. frm.Show();
  55. }
  56. }
  57. }

登陆事件代码如图:

  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.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.Data.SqlClient;
  11.  
  12. namespace c01作业_登录注册
  13. {
  14. public partial class FrmLogin : Form
  15. {
  16. public FrmLogin()
  17. {
  18. InitializeComponent();
  19. }
  20.  
  21. private void btnLogin_Click(object sender, EventArgs e)
  22. {
  23.  
  24. string connStr = "Data Source=.;Initial Catalog=MySchoolMoreData;Integrated Security=True";
  25.  
  26. using (SqlConnection conn = new SqlConnection(connStr))
  27. {
  28.  
  29. conn.Open();
  30. //1.创建命令语句 .使用了参数占位。以后服务器在执行这条sql命令的时候,就需要你也传递了对应名称的参数
  31.  
  32. string sql = string.Format("select COUNT(*) from [User] where UserName=@name and Pass=@pwd");
  33.  
  34. //2.创建出对应的参数,以后服务器执行命令的时候,会来找@name参数值
  35.  
  36. SqlParameter p = new SqlParameter("@name", txtName.Text.Trim());
  37.  
  38. //@可以省略,名称也不区分大小写,但是字符的组成要一样
  39.  
  40. SqlParameter p2 = new SqlParameter("pwd",txtPwd.Text.Trim());
  41.  
  42. //创建命令对象
  43.  
  44. SqlCommand command = new SqlCommand(sql, conn);
  45.  
  46. //3.同时需要将配套的参数对象传递给服务器来使用
  47.  
  48. command.Parameters.Add(p);
  49. command.Parameters.Add(p2);
  50.  
  51. int num=Convert.ToInt32(command.ExecuteScalar());
  52. //判断
  53. if (num > 0)
  54. {
  55. MessageBox.Show("登录成功");
  56. }
  57. else
  58. {
  59. MessageBox.Show("登录失败");
  60. }
  61. }
  62. }
  63. }
  64. }

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

利用“参数赋值”防范SQL注入漏洞攻击的更多相关文章

  1. 防范SQL注入漏洞攻击

    原理:通过拼sql语句,在输入框里输入' ; SHOW TABLES;注入这样的代码, 防范:你把全部的特殊符号都过滤掉(如单引号,双引号),自然就不会被注入 使用mysql_real_escape_ ...

  2. [SQL SERVER系列]读书笔记之SQL注入漏洞和SQL调优

    最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“'1'='1'”这个表达式永远返回 true, ...

  3. 读书笔记之SQL注入漏洞和SQL调优

    原文:读书笔记之SQL注入漏洞和SQL调优 最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“' ...

  4. SQL注入漏洞和SQL调优SQL注入漏洞和SQL调优

    SQL注入漏洞和SQL调优 最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“'1'='1'”这 ...

  5. 利用SQL注入漏洞登录后台

    所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询 ...

  6. 浅谈SQL注入漏洞以及防范策略

    --HeShiwei 2014-5-15 什么是SQL注入 SQL注入,指的是用户通过向登录框输入恶意字符,利用代码的字符串拼接漏洞进行网站注入攻击,最终导致整个网站用户表信息泄露的攻击方式.黑客就是 ...

  7. sql注入学习笔记,什么是sql注入,如何预防sql注入,如何寻找sql注入漏洞,如何注入sql攻击 (原)

    (整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文章最后关于如何预防sql注入) (整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文 ...

  8. zabbix 爆高危 SQL 注入漏洞,可获系统权限(profileIdx 2 参数)

    漏洞概述 zabbix是一个开源的企业级性能监控解决方案.近日,zabbix的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻击者无需授权登陆即可登陆zabbix管理系统 ...

  9. 网络安全学习阶段性总结:SQL注入|SSRF攻击|OS命令注入|身份验证漏洞|事物逻辑漏洞|目录遍历漏洞

    目录 SQL注入 什么是SQL注入? 掌握SQL注入之前需要了解的知识点 SQL注入情况流程分析 有完整的回显报错(最简单的情况)--检索数据: 在HTTP报文中利用注释---危险操作 检索隐藏数据: ...

随机推荐

  1. C3P0连接池配置方式

    c3p0的配置方式分为三种,分别是 1.setters一个个地设置各个配置项 2.类路径下提供一个c3p0.properties文件 3.类路径下提供一个c3p0-config.xml文件 1.set ...

  2. UILable  /  UITextField  /   UIButton

    // 获取屏幕大小的view UIView *contentView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]; // ...

  3. out返回值的用法与用途

    static void Main(string[] arr) { Console.WriteLine("请输入用户名"); string uname = Console.ReadL ...

  4. 更好的使用chrome

    Ctrl+tab           在标签页之间切换 Ctrl+1              到 Ctrl+8 切换到指定位置编号的标签页.您按下的数字代表标签页横条上的相应标签位置 Ctrl+9 ...

  5. angular json转义html

    第一步json输出的内容反编码 function htmldecode(s){ var div = document.createElement('div'); div.innerHTML = s; ...

  6. [Mugeda HTML5技术教程之10]发布内容

    动画作品制作好后,就要拿来使用,怎么发布到想要的位置也是动画制作者比较关心的问题.这一节,我们讲述怎样将制作好的动画内容发布到想要的地方.对制作好的内容,可能的使用场景主要有以下三种:直接导出:发布到 ...

  7. 今日分享一点干货。PHP中课程表的实现。

    首先贴代码,代码贴完再细说: 前段HTML: <div id="studentRead" class="reading" style="z-in ...

  8. css 单位 px em rem

    http://www.cnblogs.com/leejersey/p/3662612.html

  9. C语言初学 比较五个整数并输出最大值和最小值2

    #include <stdio.h> int main() { int i,a[5]; int max = 0,min = 0; printf("输入5个整数(空格隔开) :\n ...

  10. C++类的数组元素查找最大值问题

    找出一个整型数组中的元素的最大值. /*找出一个整型数组中的元素的最大值.*/ #include <iostream> using namespace std; class ArrayMa ...