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

news2025/1/24 8:32:47

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;
                    }
                }

            }
        }
    }
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

骨传导蓝牙耳机哪款好?掌握几大选购技巧不再踩坑

骨传导蓝牙耳机,顾名思义就是依靠骨头传递声音的耳机,它们的佩戴方式与市面上常见的入耳式耳机显著不同。在骨传导技术领域,它的地位犹如智能手机界的苹果,无论是用户体验还是整体声誉都相当出色,赢得了广泛的消费者认…

【Web安全】SQL各类注入与绕过

【Web安全】SQL各类注入与绕过 【Web安全靶场】sqli-labs-master 1-20 BASIC-Injection 【Web安全靶场】sqli-labs-master 21-37 Advanced-Injection 【Web安全靶场】sqli-labs-master 38-53 Stacked-Injections 【Web安全靶场】sqli-labs-master 54-65 Challenges 与62关二…

删除指定的数

删除指定的数 题目描述:解法思路:解法代码:运行结果: 题目描述: 先输入10个整数存放在数组中,再输入⼀个整数n,删除数组中所有等于n的数字,数组中剩余的数组保证数组的最前面&#…

python跨文件夹调用

如图所示,我们要在bin文件夹下的run_patchcore.py文件中调用src/patchcore文件夹下的backbone.py, common.py等文件。如第13行 方法1:将patchcore的上一层目录src添加到环境变量中 run_patchcore.py 文件中写入import sys sys.path.append(/home/rui/P…

【QA-SYSTEMS】CANTATA-解决Jenkins中build Cantata报错

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 解决Jenkins中build Cantata测试项目报找不到license server的错误。 2、 问题场景 在Jenkins中build Cantata测试项目,报错“Failed to figure out the license server correctly”。 3、软硬件环…

Java精品项目--第7期基于SpringBoot的驾校后台管理系统的设计分析与实现

项目使用技术栈 JavaSpringBootMavenMySQLMyBatisShiroHTMLVue.js(非前后端分离)… 项目截图

开发一个小程序需要多少钱

【腾讯云】 爆款2核2G3M云服务器首年 61元,叠加红包再享折上折 要做小程序的小伙伴们福利来啦! 抢购方式: 方式一:直达链接》点我直接抢购 方式二:长按住识别以下官方二维码直接抢购 01 小程序认证 根据微信公众平台…

每日一题 — 有效三角形的个数

611. 有效三角形的个数 - 力扣(LeetCode) 思路: 双指针思想,先将数据排序 然后先固定最大的数Max,也就是数组最后的数再定义一左一右两个下标 left 、 right,当这个值相加大于最大的数,那么他两…

软件设计师12--进程的概念概述

软件设计师12--进程的概念概述 考点1:线程的概念进程的概念进程与程序进程与线程例题: 考点2:进程的状态例题: 考点1:线程的概念 进程的概念 进程与程序 进程与线程 进程的2个基本属性:可拥有资源的独立单…

二分查找算法:高效搜索有序数据的利器

二分查找算法:高效搜索有序数据的利器 在计算机科学中,搜索是一项基本而重要的操作。对于有序数据,二分查找算法是一种高效的搜索方法。本文将介绍二分查找算法的原理、实现以及其在实际应用中的优势,帮助读者理解和应用这一常用的…

当前爆火的:ChatGPT4、Claude3、Gemini、Sora、GPTs及AI领域中的集中大模型的最新技术

原文链接:当前爆火的:ChatGPT4、Claude3、Gemini、Sora、GPTs及AI领域中的集中大模型的最新技术 第一:2024年AI领域最新技术 1.最新超强模型Claude3使用 2.OpenAI新模型-GPT-5 3.谷歌新模型-Gemini使用 4.Meta新模型-LLama3 5.阿里巴巴…

【教育部白名单赛事】C语言编程题解析--软件编程邀请赛(决赛)

文章目录 1、保留12位小数的浮点数2、气温统计3.大写字母的判断4、【递归】母鸡的故事5、小白免再排队 1、保留12位小数的浮点数 输入一个双精度浮点数,保留12位小数,输出这个浮点数。 时间限制:1000 内存限制:65536 【输入】 只…

24计算机考研调剂 | 北京语言大学

北京语言大学 刘忠宝教授课题组招收计算机学硕调剂生2名 考研调剂招生信息 学校:北京语言大学 专业:工学->计算机科学与技术->计算机应用技术 年级:2023 招生人数:2 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式仅限APP查看) 补充内容 一、…

2024护网面试题精选(一)

0x00.基础漏洞篇 00-TOP10漏洞 1.SQL注入 2.失效的身份认证和会话管理 3.跨站脚本攻击XSS 4.直接引用不安全的对象 5.安全配置错误 6.敏感信息泄露 7.缺少功能级的访问控制 8.跨站请求伪造CSRF 9.实验含有已知漏洞的组件 10.未验证的重定向和转发 01-SQL注入漏洞 …

git unable to access的方式,【有代理】

git unable to access的方式,【有代理】 Git命令取消proxy代理 git config --global --unset http.proxy git config --global --unset https.proxy查看自身代理,这边小打个码。 然后切换 git config git config --global http.proxy http://127.0.0.…

Redis实战—商户查询缓存

本博客为个人学习笔记,学习网站:黑马程序员Redis入门到实战 实战篇之商户查询缓存 目录 什么是缓存 添加Redis缓存 缓存更新策略 数据库缓存不一致解决方案 案例:给查询商铺的缓存添加超时剔除和主动更新策略 缓存穿透 案例&#xff1…

【书生·浦语大模型实战营】第6节 OpenCompass 大模型评测 课后作业

OpenCompass 大模型评测 0. 课程链接1. 课后作业1.1 基础作业1.2 进阶作业 2. 结业总结 0. 课程链接 链接:https://github.com/InternLM/tutorial/blob/main/opencompass/opencompass_tutorial.md 1. 课后作业 1.1 基础作业 使用 OpenCompass 评测 InternLM2-Cha…

Map集合体系——遍历,HashMap,TreeMap,LikedHashMap

认识Map集合 Map集合体系特点 方法 代码示例 package com.zz.Map;import java.util.*;public class Test {public static void main(String args[]){Map<String, Integer> map new HashMap <>();//经典代码&#xff0c;按照键 无序 不重复 无索引map.put("…

Android岗大厂面试官常问的那些问题,2024年Android者未来的出路在哪里

前言 伟人曾经说过&#xff1a; 书是人类进步的阶梯 书中自有黄金屋&#xff0c;书中自有颜如玉 读书破万卷&#xff0c;下笔如有神 书是唯一不死的东西。 书籍是伟大的天才留给人类的遗产。 最近有很多朋友在我的公众号上提问“Android开发的经典入门教材和学习路线&#xff…

机械臂中TCP配置

红色、绿色、蓝色箭头分别代表x、y、z三个方向