第三周学习笔记

第三周学习笔记

这周主要学习代码编译时应考虑到的安全性,保密性问题。

1、对密码应进行加密村纯,存储时正常使用的是用哈希算法,如:(账号,HASHBYTES(‘MD5’,’密码’));

2、密码输入显示正常使用星号显示,防止输入时泄露了数据。

3、简单的数据库连接对照验证,容易出现代码拼接漏洞,如:

 sqlCommand.CommandText =                                                        //指定SQL命令的命令文本;命令文本由字符串拼接而成;

  "SELECT COUNT(1) FROM tb_User" + " WHERE No='" + this.txb_UserNo.Text.Trim() + "'"              

//将文本框的文本清除首尾的空格后,拼接至命令文本中; 

+ " AND Password=HASHBYTES('MD5','" + this.txb_Password.Text.Trim() + "');";

该段代码中存在着编译漏洞,如:我们可在登陆账号框中随意输入一个有效账号,并在密码框中输入: ) or 1=1;’--’)  。该字段可以达到注释作用,使后面后面的代码无效,这是利用拼接漏洞SQLl注入式攻击。对此我们可以使用参数来弥补这一漏洞。

 

4、使用命令参数文件,防止代码漏洞,提高数据登录的安全性,虽然编译时麻烦很多,但安全性方面有了更大的保障。部分代码如下:

 sqlCommand.CommandText =

                "SELECT COUNT(1) FROM tb_User WHERE No=@No AND Password=HASHBYTES('MD5',@Password);";  

 //指定SQL命令的命令文本;命令文本包含参数;

 #region SQL参数用法1

 SqlParameter sqlParameter =                                                            

//声明SQL参数

sqlCommand.Parameters.AddWithValue("@No",this.txb_UserNo.Text.Trim());                 

//调用方法AddWithValueSQL命令的参数集合添加参数的名称、值,同时实例化SQL参数;

 sqlParameter.SqlDbType = SqlDbType.Char;                                                  

  //设置SQL参数对应的SQL Server数据类型;

sqlParameter.Size = 10;                                                                  

   //设置SQL参数的长度;

 #endregion

 #region SQL参数用法2

sqlCommand.Parameters.AddWithValue("@Password",this.txb_Password.Text.Trim());            

 //直接调用方法AddWithValueSQL命令的参数集合添加参数的名称、值;

sqlCommand.Parameters["@Password"].SqlDbType=SqlDbType.VarChar;           

 #endregion

5、为防止出现错误时查找不严谨,我们可以使用命令框验证,如:

MessageBox.show(sqlcommand.CommandText);

6、前期准备完毕后,打开数据库连接,记得随后就要关闭,并验证登陆,具体内容如:

sqlConnection.Open();                                                                       

//打开SQL连接;

  int rowCount = (int)sqlCommand.ExecuteScalar();                                           

 //调用SQL命令的方法ExecuteScalar来执行命令,并接受单个结果(即标量);

 sqlConnection.Close();                                                                      

//关闭SQL连接;

 if (rowCount == 1) {                                                       

 //若查得所输用户号相应的1行记录;

 MessageBox.Show("登录成功。");                                                          

//显示正确提示;

 }

  else                                                                                        

//否则;

 {

 MessageBox.Show("用户号/密码有误,请重新输入!");                                       

//显示错误提示;

  this.txb_Password.Focus();                                                              

//密码文本框获得焦点;

 this.txb_Password.SelectAll();   

}     

  7、登录中存在漏洞,注册时亦存在一些漏洞,如重复插入情况 ,导致的出错,我们可以使用Try(存放易出问题的语句)···Catch(声明异常,可用2627主键重复提示,也可用自己的提示)语句。如:

int rowAffected = 0;                                                                      

  //声明整型变量,用于保存受影响行数;

 string message = "";                                                                       

 //声明字符串变量,用于保存消息;

try                                                                                        

 //尝试;

 {

 sqlConnection.Open();                                                                 

  //打开SQL连接;

 rowAffected = sqlCommand.ExecuteNonQuery();                                          

   //调用SQL命令的方法ExecuteNonQuery来执行命令,向数据库写入数据,并返回受影响行数;

}

catch (SqlException sqlEx)                                                                 

 //捕捉SQL异常;

{

if (sqlEx.Number == 2627)                                                             

  //SQL异常编号为2627,则违反主键/唯一约束,即插入重复值;

  {

message = "您注册的用户号已存在,请重新输入!";                                     

//给出合适的错误提示;

 }

 else                                                                                   

 //否则;

{

 message = "注册失败!";                                                            

//给出一般错误提示;

}

 }

 finally                                                                                    

 //结束;

 {

sqlConnection.Close();                                                                 

 //关闭SQL连接;

 }

 if (rowAffected == 1)                                                                     

  //若成功写入1行记录;

{

 message = "注册成功。";                                                                

 //给出正确提示;

}

 MessageBox.Show(message);       

8、存储过程:    

 SqlConnection sqlConnection = new SqlConnection();                                          

//声明并实例化SQL连接;

 sqlConnection.ConnectionString =

"Server=(local);Database=EduBaseDemo;Integrated Security=sspi";                        

//在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);

 SqlCommand sqlCommand = sqlConnection.CreateCommand();                                      

//调用SQL连接的方法CreateCommand来创建SQL命令;该命令将绑定SQL连接;

sqlCommand.CommandText = "usp_insertUser";                                                

  //指定SQL命令的命令文本;命令文本为存储过程名称;

 sqlCommand.CommandType = CommandType.StoredProcedure;                                       

//SQL命令的类型设为存储过程;

sqlCommand.Parameters.AddWithValue("@No",this.txb_UserNo.Text.Trim());                    

 //SQL命令的参数集合添加参数的名称、值;

            sqlCommand.Parameters.AddWithValue("@Password",this.txb_Password.Text.Trim());             

转载于:https://www.cnblogs.com/wllw6/p/7751696.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值