第三周学习笔记
第三周学习笔记
这周主要学习代码编译时应考虑到的安全性,保密性问题。
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());
//调用方法AddWithValue向SQL命令的参数集合添加参数的名称、值,同时实例化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());
//直接调用方法AddWithValue向SQL命令的参数集合添加参数的名称、值;
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());