C#知识点-22(ADO.NET五个对象,SQL漏洞注入攻击)

ADO.NET

概念:ADO.NET就是一组类库,这组类库可以让我们通过程序的方式访问数据库,就像System.IO的类用类操作文件一样,System.Data这组类是用来操作数据库的(不光是MSSql Server),它提供了统一的编程接口让操作其他数据库(Access、Oracle等)的方式和操作MSSQL Server一致
组成:

Connection 连接数据库
Command 执行数据库语句
DataReader 只读只进的结果集
DataAdapter
DataSet 断开时连接的数据库操作

ADO.NET访问数据库的方式:

一、
        1、连接数据用Connection
        2、执行SQL语句Command
        3、执行完毕之后将结果一条一条返回。DataReader
二、
        使用DataAdapter+DataSet,这种方法本质还是通过Connection、Command、DataReader将数据全部取出来然后放到了DataSet中。//看DataAdapter的构造函数

ADO.NET连接池

由于每次正常连接数据库都会至少执行三个操作(1、登录数据库服务器  2、执行操作  3、注销用户),所以每次通过Connection向数据库服务器申请一个连接都比较耗时。【ADO.NET默认启用连接池】
为了解决上述问题,ADO.NET采用了连接池的概念

Command对象

操作Sql Server数据库使用SqlCommand对象
SqlCommand表示向服务器提交的一个命令(SQL语句等),CommandText属性为要执行的SQL语句,ExecuteNonQuery方法执行一个非查询语句(Update、Insert、Delete等)
常用的三个方法:
        1、ExecuteNonQuery()        执行对数据库的增删改,返回收影响的行数
        2、ExecuteScalar()        执行查询,返回首航首列
        3、ExecuteReader()        执行查询,返回DataReader对象;执行有多行结果集的用ExecuteReader

HasRow属性返回是否有行

ADO.NET异常处理

在执行数据库操作时,如果数据库服务器未打开,或者sql语句写错了会怎么样?(delete无效、违反约定、数据库服务出问题)
这些情况可以用try...catch...finally来捕获异常
使用异常处理可以保证一个功能出错不影响另一个功能,比如添加操作失败,不影响查询的操作

SQL注入漏洞攻击

登录判断:select * from T_Users where UserName=... and Password=...,将参数拼到SQL语句中。

构造恶意的Password: ' or '1'='1

防范注入漏洞攻击的方法:不使用SQL语句拼接,通过参数赋值

SQL语句使用@UserName表示“此处用参数代替”,向SqlCommandParameters中添加参数

cmd.CommandText = "select * from [user] where uUserName=@UserName and uPwd=@Password";
cmd.Parameters.Add(new SqlParameter(“@ UserName ","admin"));
cmd.Parameters.Add(new SqlParameter(“@ Password ",password));

参数在SQL Server内部不是简单的字符串替换,SQLServer直接用添加的值进行数据比较,因此不会有注入漏洞攻击


{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (IsInput())
            {
                if (IsLogin(txtUserName.Text.Trim(),txtUserPwd.Text.Trim()))
                {
                    MessageBox.Show("登陆成功");
                }
                else
                {
                    MessageBox.Show("登陆失败");
                }
            }
            else
            {
                MessageBox.Show("请完整输入用户名和密码");
            }
        }
        bool IsInput()
        {
            if (txtUserName.Text.Length==0||txtUserPwd.Text.Length==0)
            {
                return false;
            }
            return true;
        }
        bool IsLogin(string name,string pwd)
        {
            string conStr = "Data Source = .;Initial catalog = MySchool; uid = sa; pwd = root";
            //创建连接对象
            using (SqlConnection con = new SqlConnection(conStr))
            {
                //以下三条语句都可以让攻击者进行Sql漏洞注入攻击
                //string sql = "select count(*) from [user] where uname = '" + name + "'and pwd = '" + pwd + "'";
                //string sql = string.Format("select count(*) from [user] where uname = '{0}' and upwd ='{1}'", name, pwd);
                //string sql = $"select count(*) from[user] where uname ='{name}' and upwd = '{pwd}'";
                //使用参数化避免漏洞注入攻击
                string sql = "select * from [user] where uname = @name and upwd = @pwd";

                //创建command对象
                using (SqlCommand cmd = new SqlCommand(sql,con))
                {
                    //开启连接
                    con.Open();
                    //创建两个参数对象,把参数和变量的值进行绑定,防止sql漏洞注入
                    SqlParameter param1 = new SqlParameter("@name", name);
                    SqlParameter param2 = new SqlParameter("@pwd", pwd);
                    //把两个参数对象,赋值给cmd对象的Parameters集合进行维护
                    //解析sql语句的时候,会从Parameters集合中,把两个参数的值,进行提取,然后跟sql进行拼接
                    //这是避免sql漏洞注入的核心
                    cmd.Parameters.Add(param1);
                    cmd.Parameters.Add(param2);

                    //执行查询,返回一个DataReader对象
                    SqlDataReader reader = cmd.ExecuteReader();
                    if (reader.HasRows)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }

            }
        }
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/434313.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java精品项目--第5期基于SpringBoot的高速收费系统的设计分析与实现

项目使用技术栈 SpringBootMavenShiroMySQLMybatis-PlusJavaJDK1.8HTML 系统介绍 项目截图

java 中 string常用方法及相关的例子

我将为您详细讲解 Java 中 String 类的常用方法及其相关例子。String 类是 Java 中最常用的类之一,它代表字符串,提供了许多用于操作字符串的方法。 1. 字符串比较 - equals(Object obj): 比较字符串的内容是否相等。 - equalsIgnoreCase(String str): 比…

阿里云域名优惠口令2024年最新,com、cn和域名注册续费使用

2024年阿里云域名优惠口令,com域名续费优惠口令“com批量注册更享优惠”,cn域名续费优惠口令“cn注册多个价格更优”,cn域名注册优惠口令“互联网上的中国标识”,阿里云优惠口令是域名专属的优惠码,可用于域名注册、续…

堆以及堆的实现

文章目录 堆的概念堆的实现HeapPushHeapPop HeapTop HeapSize HeapEmpty堆的应用 堆的概念 堆是一颗完全二叉树每个结点的值都小于子结点的值,这颗二叉树为小根堆每个结点的值都大于子结点的值,这颗二叉树为大根堆堆的定义如下:n个元素的序列…

覆盖element-ui的el-menu样式记录:背景图片、菜单图标、菜单高亮与鼠标悬浮高亮、调整子菜单等样式

页面中修改el-menu 设置background-color"transparent"&#xff0c;menu菜单下的背景图片则能正常显示了 <el-menuclass"el-menu-demo"mode"horizontal"background-color"transparent"><el-menu-item index"1">…

Java开发进大厂面试必备技能,面试初级java工程师问题

前言 今天的分享主要是讲下这个 redis&#xff0c;什么是缓存雪崩、穿透和击穿。这三个技术问题是我们平时开发工作中和面试过程中&#xff0c;必须要会的知识点&#xff0c;因为目前的互联网系统没有几个不需要用到缓存的&#xff0c;只要用到缓存的话&#xff0c;就需要掌握…

Long-term Correlation Tracking LCT目标跟踪算法原理详解(个人学习笔记)

目录 1. 算法总览2. 算法详解2.1. 基础相关滤波跟踪2.2. 各模块详解2.2.1. 相关跟踪2.2.2. 在线检测器 3. 算法实现3.1. 算法步骤3.2. 实现细节 4. 相关讨论&总结 1. 算法总览 LCT的总体流程如上图所示&#xff0c;其思想为&#xff1a;将长时跟踪&#xff08;long-term tr…

C++进阶之路---继承(一)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、继承的概念及定义 1.继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0…

MM配置1-定义、复制、删除、检查工厂

配置步骤&#xff0c;如下图&#xff1a; 双击“复制&#xff0c;删除&#xff0c;检查工厂选项” 点击“复制”按钮&#xff0c;输入参考工厂&#xff0c;和要新建的工厂 复制完成后&#xff0c;返回到上一界面&#xff0c;双击“定义工厂”选项 选中新建的1070工厂&#xff0…

超简单Windows-kafka安装配置

参考大佬文章&#xff1a; Kafka&#xff08;Windows&#xff09;安装配置启动&#xff08;常见错误扫雷&#xff09;教程_kafka在windows上的安装、运行-CSDN博客Kafka&#xff08;Windows&#xff09;安装配置启动&#xff08;常见错误扫雷&#xff09;教程_kafka在windows上…

android开发的基础,大厂程序员35岁后的职业出路在哪

为什么越来越多的年轻人感觉工作没有动力、职业发展没有希望&#xff0c;迷茫和中年危机等现象普遍发生&#xff1f; 人常说&#xff0c;安居才能乐业。 前些年&#xff0c;房价虽然也不低&#xff0c;但刚工作的年轻人&#xff0c;努力奋斗&#xff0c;攒上几年钱&#xff0c…

爬虫学习笔记-requests爬取王者荣耀皮肤图片

1.导入所需的包 import requests from lxml import etree import os from time import sleep 2.定义请求头 headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36} 3.发送请求 # hero…

线程同步的方法1——互斥锁、信号量

目录 一、引入 二、利用多线程同步解决线程并发 三、线程同步的概念 四、互斥锁 4.1互斥锁接口 4.2全局变量正确性问题&#xff08;引例&#xff09; 4.3 互斥锁例2(共享资源(打印机)使用问题) 五、信号量 5.1 信号量接口 5.2 全局变量正确性问题 5.3 信号量例2 一、…

前方高能,又一波Smartbi签约喜报来袭

近期&#xff0c;交通银行、厦门国际银行、中原农业保险、江苏中天科技等多家知名企业签约Smartbi&#xff0c;携手Smartbi实现数据驱动业务新增长。 Smartbi数10年专注于商业智能BI与大数据分析软件与服务&#xff0c;为各行各业提供提供一站式商业智能平台&#xff08;PaaS&a…

阿里云老用户可以购买99元服务器,2核2G3M固定带宽,你说牛不牛?

2024阿里云服务器优惠活动政策整理&#xff0c;阿里云99计划ECS云服务器2核2G3M带宽99元一年、2核4G5M优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M服务器61元一年、2核4G4M带宽165元1年&#xff0c;云服务器4核16G10M带宽26元1个月、149元半年&#xff0c;云服务器8核…

域名 DNS 信息查询 API 数据接口

域名 DNS 信息查询 API 数据接口 网络工具&#xff0c;多种记录类型数据返回&#xff0c;丰富的信息结构&#xff0c;毫秒级响应。 1. 产品功能 提供域名 DNS 解析完整记录&#xff1b;丰富的解析记录类型&#xff0c;包括&#xff1a;A, AAAA, MX, TXT, NS, CNAME, SRV, PTR…

pgvector docker部署测试

docker pull pgvector/pgvector:pg16 运行 docker run --name pgvector --restartalways -e POSTGRES_USERpgvector -e POSTGRES_PASSWORDpgvector -v /srv/tlw/pgvectordata:/var/lib/postgresql/data -p 54333:5432 -d pgvector/pgvector:pg16 CREATE EXTENSION vector; --…

ORACLE 如何使用dblink实现跨库访问

dbLink是简称&#xff0c;全称是databaselink。database link是定义一个数据库到另一个数据库的路径的对象&#xff0c;database link允许你查询远程表及执行远程程序。在任何分布式环境里&#xff0c;database都是必要的。另外要注意的是database link是单向的连接。在创建dat…

重装显卡驱动记录

重装显卡驱动记录 任务记录现状描述执行情况 任务 晚上回来&#xff0c;开电脑&#xff0c;发现总是进不去系统&#xff08;这个情况我经常见&#xff09;&#xff0c;但偶尔进系统&#xff0c;识别不了我的外接屏&#xff08;这个第一次见&#xff09;。来来回回重启了1h多了…

QT安装教程,手把手教会QT安装

大家好&#xff1a;衷心希望各位点赞和评论&#xff01; 安装步骤 首先去官网下载QT&#xff0c;官网&#xff1a;https://download.qt.io/https://download.qt.io/ 点击 offical_releases &#xff08;官方发行版本&#xff09;&#xff0c;如下图所示&#xff1a; 进入下图所…