防止SQL注入攻击,数据库操作类
如果不规避,在黑窗口里面输入内容时利用拼接语句可以对数据进行攻击
如:输入Code值
p001' union select * from Info where '1'='1 //这样可以查询到所有数据
SQL数据库字符串注入攻击:
需要使用cmd.Parameters这个集合
占位符: @key 代表这个位置用这个占位符占住了
Parameters这个集合中将此占位符所代表的数据补全
cmd.Parameters.Clear(); --添加占位符数据之前,要清空此集合
cmd.Parameters.Add("@pwd", Pwd); --占位符内容填充
cmd.Parameters.Add("@nname",Nname);
cmd.Parameters.Add("@sex", (Sex=="男")?"1":"0");
cmd.Parameters.Add("@bir", Birthday);
cmd.Parameters.Add("@nat", Nation);
cmd.Parameters.Add("@uname", Uname);
1.实体类:封装
封装一个类,类名与数据库表名一致
成员变量名与列名一致,多一个下划线
成员变量封装完的属性,就会与数据表中的列名一致
每一行数据都可以存成一个对象,操作这个对象,就相当于对某一行数据进行整体操作
2.数据访问类:
就是将对数据库的一些操作,单独写到一个类中,封成一些方法,等待调用
结构看起来会非常清晰。
实体类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace 实体类_和数据访问类.App_Code
{
public class Users
{
private int _ids;
/// <summary>
/// ids
/// </summary>
public int Ids
{
get { return _ids; }
set { _ids = value; }
}
private string _username;
/// <summary>
/// 用户名
/// </summary>
public string Username
{
get { return _username; }
set { _username = value; }
}
private int _password;
/// <summary>
/// 密码
/// </summary>
public int Password
{
get { return _password; }
set { _password = value; }
}
private string _nikename;
/// <summary>
/// 昵称
/// </summary>
public string Nikename
{
get { return _nikename; }
set { _nikename = value; }
}
/// <summary>
/// 性别
/// </summary>
private bool _sex; public bool Sex
{
get { return _sex; }
set { _sex = value; }
}
private DateTime _birthday;
/// <summary>
/// 生日
/// </summary>
public DateTime Birthday
{
get { return _birthday; }
set { _birthday = value; }
}
private string nation;
/// <summary>
/// 民族
/// </summary>
public string Nation
{
get { return nation; }
set { nation = value; }
}
private string _class;
/// <summary>
/// 班级
/// </summary>
public string _class1
{
get { return _class; }
set { _class = value; }
} private string _NationName;
/// <summary>
/// 民族1
/// </summary>
public string NationName
{
get { return _NationName; }
set { _NationName = value; }
} private string _ClassName;
/// <summary>
/// 班级1
/// </summary>
public string ClassName
{
get { return _ClassName; }
set { _ClassName = value; }
} }
}
创建一个类,把整个数据库表单的数据都封装一下
数据访问类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient; namespace 实体类_和数据访问类.App_Code
{
public class UsersData
{
SqlConnection conn = null;
SqlCommand cmd = null; public UsersData()
{
conn = new SqlConnection("server=.;database=data0928;user=sa;pwd=123");
cmd = conn.CreateCommand();
}
/// <summary>
/// 将数据添加到Users表中,返回true说明添加成功
/// </summary>
/// <param name="u">要添加到数据表中的Users对象</param>
/// <returns></returns>
public bool Insert(Users u)
{
bool ok = false;
int count = ;
cmd.CommandText = "INSERT INTO Users VALUES(@a,@b,@c,@d,@e,@f,@g)";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@a", u.Username);
cmd.Parameters.AddWithValue("@b", u.Password);
cmd.Parameters.AddWithValue("@c", u.Nikename);
cmd.Parameters.AddWithValue("@d", u.Sex);
cmd.Parameters.AddWithValue("@e", u.Birthday);
cmd.Parameters.AddWithValue("@f", u.Nation);
cmd.Parameters.AddWithValue("@g", u._class1);
try
{
conn.Open();
count = cmd.ExecuteNonQuery();
}
catch
{
ok = false;
}
finally
{
conn.Close();
}
if (count > )
ok = true;
return ok;
}
/// <summary>
/// 通过泛型集合对数据进行查询
/// </summary>
/// <returns>返回一个集合</returns>
public List<Users> select()
{
List<Users> list = new List<Users>();
cmd.CommandText = "select ids,UserName,[PassWord],NickName,Sex,Birthday,NationName,ClassName from users join Nation on nation.NationCode=Users.Nation JOIN dbo on Users.Class=dbo.ClassCode ";
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
while (dr.Read())
{
int p = ;
while(p<dr.FieldCount)
{
if(dr[p] is Boolean)
{
Console.Write((Boolean)dr[p]?"男":"女"+"\t");
}
else if(dr[p] is DateTime)
{
Console.Write(" "+(((DateTime)dr[p]).ToShortDateString()) + "\t" + " ");
}
else
Console.Write(dr[p]+"\t");
p++;
}
Console.WriteLine();
}
}
conn.Close();
return list;
}
/// <summary>
/// 查询是否有此用户
/// </summary>
/// <param name="usname"></param>
/// <returns>有返回true</returns>
public bool select(string usname)
{
bool has=false;
cmd.CommandText = "SELECT *FROM Users where username=@a";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@a",usname);
conn.Open();
SqlDataReader dr= cmd.ExecuteReader();
if (dr.HasRows)
has = true;
conn.Close();
return has;
}
/// <summary>
/// 删除方法
/// </summary>
/// <param name="usname"></param>
public void delect(string usname)
{
cmd.CommandText = "DELETE FROM Users WHERE UserName=@a";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@a", usname);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
} public bool Update(string uname,string uname1,string uname2)
{
bool ok = false;
int count = ;
cmd.CommandText = "update Users set "+uname1+"=@b where UserName = @a";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@a", uname);
cmd.Parameters.AddWithValue("@b", uname2);
try
{
conn.Open();
count = cmd.ExecuteNonQuery();
}
catch { ok = false; }
finally
{
conn.Close();
} if (count > )
ok = true; return ok;
} }
}
注:
1、一般约定,在项目里新建一个叫做App_xx的文件夹,将实体类和数据访问类统一放在其中
2、一般实体类使用想要进行操作的数据库中的表名来命名,数据库访问类用此表的表名后面加上Data来命名
3、数据访问类开头格式:
class userdata
{
SqlConnection conn = null;
SqlCommand cmd = null; public userdata()
{
conn = new SqlConnection("server=.;database=Data0928;user=sa;pwd=123");
cmd = conn.CreateCommand();
}
4、匿名方法
例
List<Users> ulist = new UsersData().Select();
直接使用UserData类中的Select方法(查询表中所有数据),并赋值给叫做ulist的泛型集合,从而比较简便的获取到所有数据,节省代码
有些方法也可以不用赋值直接进行调用
if (new userdata().select(uname))
namespace 泛型集合
{
class Program
{
static void Main(string[] args)
{
//创建泛型集合对象
List<int> list=new List<int>(); //添加原素1,2,3
list.Add(1);
list.Add(2);
list.Add(3); //添加数组{1,2,3,4,5,6}
list.AddRange(new int[] {1,2,3,4,5,6}); //添加本身(泛型集合)
list.AddRange(list); //清空 list.Clear();
//移除某个原素 list.Remove(1);
//移除一定范围的元素 list.RemoveRange(0,2);
//移除指定索引位置的原素 list.RemoveAt(3);
//原素反转 list.Reverse();
//原素升序排序 list.Sort(); //list泛型集合可以和数组互相转换
int[] nums = list.ToArray();
List<int> listint = nums.ToList(); //遍历集合
for (int i = 0; i < list.Count;i++ )
{
Console.WriteLine(list[i]);
}
Console.ReadKey();
}
}泛型集合
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using 实体类_和数据访问类.App_Code; namespace 实体类_和数据访问类
{
class Program
{
static void Main(string[] args)
{
Console.Write("编号" + "\t" + "用户名" + "\t" + "密码" + "\t" + "昵称" + "\t" + "性别" + "\t" + "出生日期" + "\t" + "民族" + "\t" + "班级" + "\n");
//List<Users> ulist = new UsersData().select();
List<Users> wewe = new List<Users>();
UsersData udd=new UsersData();
wewe=udd.select(); foreach (Users uu in wewe)
{
Console.WriteLine(uu.Ids + "" + uu.Username + "" + uu.Password + "" + uu.Nikename + "" + uu.Sex + "" + uu.Birthday + "" + uu.NationName + "" + uu.ClassName);
}
for (; ; )
{
Console.WriteLine("1.添加,2.删除,3.修改,4,查看");
Console.Write("请输入你要操作的序号:");
string aa = Console.ReadLine();
if (aa == "")
{
Users user = new Users();
Console.Write("请输入要添加的用户名");
user.Username = Console.ReadLine();
Console.Write("请输入要添加的密码");
user.Password = int.Parse(Console.ReadLine());
Console.Write("请输入要添加的昵称");
user.Nikename = Console.ReadLine();
Console.Write("请输入要添加的性别");
user.Sex = bool.Parse(Console.ReadLine());
Console.Write("请输入要添加的生日");
user.Birthday = DateTime.Parse(Console.ReadLine());
Console.Write("请输入要添加的民族");
user.Nation = Console.ReadLine();
Console.Write("请输入要添加的班级");
user._class1 = Console.ReadLine(); UsersData ud = new UsersData();
bool isok = ud.Insert(user);
if (isok)
{
Console.WriteLine("添加成功");
}
else
Console.WriteLine("添加失败");
}
else if(aa=="")
{
Console.Write("请输入要删除的用户名:");
string usname = Console.ReadLine();
if(new UsersData().select(usname))
{
Console.WriteLine("已查到此用户,是否删除(Y,N)");
string cc = Console.ReadLine();
if(cc.ToUpper()=="Y")
{
new UsersData().delect(usname);
Console.WriteLine("删除成功");
}
else if(cc.ToUpper()=="N")
{
Console.WriteLine("取消了删除操作");
}
else if(cc=="")
{
Console.WriteLine("请按提示操作");
}
else
Console.WriteLine("请按提示操作");
}
else
{
Console.WriteLine("没有查到要删除的数据");
} }
else if(aa=="")
{
SqlConnection conn = new SqlConnection("server=;database=data0928;user=sa;pwd=123");
SqlCommand cmd = conn.CreateCommand();
Console.Write("请输入想要修改的用户名:");
string z = Console.ReadLine();
cmd.CommandText = "select ids,UserName,[PassWord],NickName,Sex,Birthday,NationName,ClassName from users join Nation on nation.NationCode=Users.Nation JOIN dbo on Users.Class=dbo.ClassCode where username='" + z + "'";
conn.Open();
SqlDataReader dw = cmd.ExecuteReader();
if (dw.HasRows)
{
while (dw.Read())//循环每一行 当超出时返回false
{
Console.WriteLine(dw["ids"] + "\t" + dw["UserName"] + "\t" + dw["PassWord"] + "\t" + dw["NickName"] + "\t" + (Convert.ToBoolean(dw["Sex"]) ? "男" : "女") + "\t" + Convert.ToDateTime(dw["Birthday"]).ToString("yyyy年MM月dd日") + "\t" + dw["NationName"] + "\t" + dw["ClassName"]);
}
conn.Close();
Console.Write("是否确定修改此条数据?(Y/N)");
string yn = Console.ReadLine();
if (yn.ToUpper() == "Y")
{
string uname = Console.ReadLine();
Console.Write("请输入密码:");
string pwd = Console.ReadLine();
Console.Write("请输入昵称:");
string nick = Console.ReadLine();
Console.Write("请输入性别:");
string sex = Console.ReadLine();
Console.Write("请输入生日:");
string bir = Console.ReadLine();
Console.Write("请输入民族:");
string nation = Console.ReadLine();
Console.Write("请输入班级:");
string cla = Console.ReadLine();
cmd.CommandText = "UPDATE Users set PassWord = '" + pwd + "',NickName = '" + nick +
"',Sex='" + sex + "',Birthday='" + bir + "',Nation='" + nation + "',Class='" + cla +
"' where UserName = '" + z + "'";
conn.Open();
int ui = cmd.ExecuteNonQuery();
conn.Close();
if (ui > )
{
Console.WriteLine("修改成功");
}
else
{
Console.WriteLine("修改失败");
}
}
else if (yn.ToUpper() == "N")
{
Console.WriteLine("取消了修改操作");
}
else
{
Console.WriteLine("请按提示操作");
}
}
else
{
Console.WriteLine("没有此条数据");
}
}
else if(aa=="")
{
Console.Write("编号" + "\t" + "用户名" + "\t" + "密码" + "\t" + "昵称" + "\t" + "性别" + "\t" + "出生日期" + "\t" + "民族" + "\t" + "班级" + "\n");
List<Users> asas = new List<Users>();
UsersData wdd = new UsersData();
asas = wdd.select(); foreach (Users uu in asas)
{
Console.WriteLine(uu.Ids + "\t" + uu.Username + "\t " + uu.Password + "\t" + uu.Nikename + "\t" + uu.Sex + "\t" + uu.Birthday + "\t" + uu.NationName + "\t" + uu.ClassName);
}
}
else if (aa == "")
{
Console.WriteLine("请按提示操作");
}
else
{
Console.WriteLine("请按提示操作");
} } }
}
}
防止SQL注入攻击,数据库操作类的更多相关文章
- SQL SERVER C#数据库操作类(连接、执行SQL)
using System; using System.Collections; using System.Collections.Specialized; using System.Data; usi ...
- ADO.NET操作SQL Server:数据库操作类(已封装)
1.增.删.改通用方法 /// <summary> /// 增.删.改通用方法 /// </summary> /// <param name="commandT ...
- ADO.NET操作SQL Server:数据库操作类(未封装)
1.添加数据 /// <summary> /// 添加数据 /// </summary> /// <param name="newEntity"> ...
- C#全能数据库操作类及调用示例
C#全能数据库操作类及调用示例 using System; using System.Data; using System.Data.Common; using System.Configuratio ...
- WEB安全第四篇--与数据库的亲密接触:SQL注入攻击
零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...
- 【数据库】SQL注入攻击
背景: 机房收费系统验收的时候,师父提到SQL注入攻击.自己以前看过类似的博客大概知道一些这方面的事情,于是自己动手查了查. 定义: 所谓SQL注入,通过SQL命令插入到Web表单提交或者输入域名或页 ...
- MySQL数据库(六)-- SQL注入攻击、视图、事物、存储过程、流程控制
一.SQL注入攻击 1.什么是SQL注入攻击 一些了解sql语法的用户,可以输入一些关键字 或合法sql,来导致原始的sql逻辑发生变化,从而跳过登录验证 或者 删除数据库 import pymysq ...
- MySQL数据库(六) —— SQL注入攻击、视图、事物、存储过程、流程控制
SQL注入攻击.视图.事物.存储过程.流程控制 一.SQL注入攻击 1.什么是SQL注入攻击 import pymysql conn = pymysql.Connect( user="roo ...
- JDBC基础:JDBC快速入门,JDBC工具类,SQL注入攻击,JDBC管理事务
JDBC基础 重难点梳理 一.JDBC快速入门 1.jdbc的概念 JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以 ...
- day40:python操作mysql:pymysql模块&SQL注入攻击
目录 part1:用python连接mysql 1.用python连接mysql的基本语法 2.用python 创建&删除表 3.用python操作事务处理 part2:sql注入攻击 1.s ...
随机推荐
- 《算法问题实战策略》-chaper8-动态规划法
Q1:偶尔在电视上看到一些被称为“神童”的孩子们背诵小数点以后几万位的圆周率.背诵这么长的数字,可利用分割数字的方法.我们用这种方法将数字按照位数不等的大小分割后再背诵. 分割形式如下: 所有数字都相 ...
- D - Silver Cow Party
题目大意: 在一个农场里面所有的牛都会来参加大牛举办的派对,不过农场的路都是单向的,而且每头牛都喜欢都最短的路程,那么问题来了,求出来来回花费时间最多的那头牛所用的时间... //////////// ...
- 设计模式21---设计模式之享元模式(Flyweight)(结构型)
1.讲解享元模式(结构型) 1.1享元模式定义 运用共享技术有效地支持大量细粒度对象. 享元:把内部状态共享出来 1.2享元模式要点 重点在于分离变与不变. 把一个对象的状态分为内部状态和外部状态,内 ...
- ZOJ3329之经典概率DP
One Person Game Time Limit: 1 Second Memory Limit: 32768 KB Special Judge There is a very ...
- OSChina 其中很重要的一类——RequestContext
RequestContext 这个类在 OSChina 中是很重要的一个类.该类由全局 Filter 进行初始化.并传递给包含 Action 和 页面中直接使用.使用时通过 RequestContex ...
- JAVA中的继承和覆盖
java里面的继承是子类继承父类的一些方法和属性(除private属性和方法之外):对于父类的私有属性和方法子类是没有继承的.可是要想子类也能訪问到父类的私有属性,必须给私有属性以外界訪问的方法接口. ...
- css之选择器
我们都用过jquery,使用jquery选择器,非常的简单,最近刚好有项目上手,拿起书本看了一下,发现好多的东西都忘掉了,好记性不如烂笔头,就将这章内容记录下来,现在我们看下css原生的选择器. 选择 ...
- const中的一些tricky的地方
1. 为了逻辑上的优化需要,const成员函数可能想修改某些成员变量,把这些成员变量定义为mutable可以绕过const的检查 2. 调用const和non-const的参数的函数可以重载 3. s ...
- [转] ubuntu 12.04 安装 nginx+php+mysql web服务器
Nginx 是一个轻量级,以占用系统资源少,运行效率而成为web服务器的后起之秀,国内现在很多大型网站都以使用nginx,包括腾讯.新浪等大型信息网站,还有淘宝网站使用的是nginx二次开发的web服 ...
- HDU 2639 (01背包第k优解)
/* 01背包第k优解问题 f[i][j][k] 前i个物品体积为j的第k优解 对于每次的ij状态 记下之前的两种状态 i-1 j-w[i] (选i) i-1 j (不选i) 分别k个 然后归并排序并 ...