首页 > 代码库 > 字符串攻击、防攻击、实体类、数据访问类--2016年11月29日

字符串攻击、防攻击、实体类、数据访问类--2016年11月29日

防止SQL数据库字符串注入攻击

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

 

 

实体类

封装

封装一个类,类名与数据库表名一致
成员变量名与列名一致,多一个下划线
成员变量封装完的属性,就会与数据表中的列名一致

例:

技术分享
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 实体类_数据访问类.App_Code{    public class Users    {        private int _code;        /// <summary>        /// code        /// </summary>        public int Code        {            get { return _code; }            set { _code = value; }        }        private string _usename;        /// <summary>        /// 用户名        /// </summary>        public string Usename        {            get { return _usename; }            set { _usename = value; }        }        private string _password;        /// <summary>        /// 用户密码        /// </summary>        public string Password        {            get { return _password; }            set { _password = value; }        }        private string _nick;        /// <summary>        /// 昵称        /// </summary>        public string Nick        {            get { return _nick; }            set { _nick = value; }        }        private bool _sex;        /// <summary>        /// 性别        /// </summary>        public bool Sex        {            get { return _sex; }            set { _sex = 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 DateTime _birthday;        /// <summary>        /// 生日        /// </summary>        public DateTime Birthday        {            get { return _birthday; }            set { _birthday = value; }        }    }}

每一行数据都可以存成一个对象,操作这个对象,就相当于对某一行数据进行整体操作

 

 

数据访问类

就是将对数据库的一些操作,单独写到一个类中,封成一些方法,等待调用

结构看起来会非常清晰

例:

技术分享
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data.SqlClient;namespace 实体类_数据访问类.App_Code{    public class UserDate    {        SqlConnection conn = null;        SqlCommand com = null;        public UserDate()        {            conn = new SqlConnection("server=.;database=Data1128;user=sa;pwd=123");            com = conn.CreateCommand();        }        /// <summary>        /// 将数据添加到Users表中,添加成功返回true,失败返回false        /// </summary>        /// <param name="u">要添加到表中的Users对象</param>        /// <returns>添加成功返回true,失败返回false</returns>        public bool insert(Users u)        {            bool ok = false;            int count = 0;            com.CommandText = "insert into Users values(@usename,@password,@nick,@sex,@nation,@class,@birthday)";            com.Parameters.Clear();            com.Parameters.AddWithValue("@usename",u.Usename);            com.Parameters.AddWithValue("@password", u.Password);            com.Parameters.AddWithValue("@nick", u.Nick);            com.Parameters.AddWithValue("@sex", u.Sex);            com.Parameters.AddWithValue("@nation", u.Nation);            com.Parameters.AddWithValue("@class", u._class1);            com.Parameters.AddWithValue("@birthday", u.Birthday);            try            {                conn.Open();                count=com.ExecuteNonQuery();            }            catch            {                ok = false;            }            finally            {                conn.Close();            }            if(count>0)            {                ok = true;            }            return ok;        }        /// <summary>        /// 通过泛型集合对数据进行查询        /// </summary>        /// <returns>返回一个集合</returns>        public List<Users> Select()        {            List<Users> list= new List<Users>();            com.CommandText = "select *from Users";            conn.Open();            SqlDataReader dr = com.ExecuteReader();            if(dr.HasRows)            {                while(dr.Read())                {                    Users u = new Users();                    u.Code = Convert.ToInt32(dr["code"]);                    u.Usename = dr["usename"].ToString();                    u.Password = dr["password"].ToString();                    u.Nick = dr["nick"].ToString();                    u.Sex = Convert.ToBoolean(dr["sex"]);                    u.Nation = dr["nation"].ToString();                    u._class1 = dr["class"].ToString();                    u.Birthday = Convert.ToDateTime(dr["birthday"]);                    list.Add(u);                }            }            conn.Close();            return list;        }        /// <summary>        /// 根据usename进行查询        /// </summary>        /// <param name="usename">要查询的usename对象</param>        /// <returns>返回bool类型的值,返回true表示有usename这条数据</returns>        public bool select(string usename)        {            bool has = false;            com.CommandText = "select *from Users where usename=@usename";            com.Parameters.Clear();            com.Parameters.AddWithValue("@usename",usename);            conn.Open();            SqlDataReader dr = com.ExecuteReader();            if(dr.HasRows)            {                has = true;            }            conn.Close();            return has;        }        //public void delete(string username)        //{        //    com.CommandText = "delete from Users where usename=@usename";        //    com.Parameters.Clear();        //    com.Parameters.AddWithValue("@usename", username);        //    conn.Open();        //    com.ExecuteNonQuery();        //    conn.Close();        //}        /// <summary>        /// 删除数据        /// </summary>        /// <param name="username">要查询的usename对象</param>        /// <returns>返回bool类型的值,返回true表示删除成功</returns>        public bool delete(string username)        {            bool have = false;            int cc = 0;            com.CommandText = "delete from Users where usename=@usename";            com.Parameters.Clear();            com.Parameters.AddWithValue("@usename", username);            try            {                conn.Open();                cc = com.ExecuteNonQuery();            }            catch            {                have = false;            }            finally            {                conn.Close();            }            if (cc > 0)            {                have = true;            }            return have;        }    }}

 

 

 

*三层开发:
界面层 - UI层
业务逻辑层 - C#代码部分
数据访问层 - 实体类和数据访问类

字符串攻击、防攻击、实体类、数据访问类--2016年11月29日