日期:2014-05-18  浏览次数:20386 次

都来看看,简单登陆代码
这是我写的一个登陆sql查询代码。
写的很垃圾,自己看着都觉得不舒服~~希望大家指正一下。代码没有问题,完全能够正常运行,只是优化一下,可重用性高点,写的更专业一些。不知道专业写登陆的这段代码怎么写的啊?希望多加指点
只是简单的传过去帐号和密码去数据库验证

public   bool   adminYanzheng(string   sname,string   pwd)
{
string   adminSql= "select   pwd   from   admin   where   zname= ' "+sname+ " ' ";
SqlCommand   com=new   SqlCommand(adminSql,con);
con.Open();
string   Yanzheng=null;
try
{
Yanzheng=com.ExecuteScalar().ToString();
}
catch(Exception   e)
{
e.ToString();
return   false;
}
con.Close();
if(pwd.Equals(Yanzheng))
{
return   true;
}
else
{
return   false;
}
}



------解决方案--------------------
1.命名使用英文,比如AdminCheck,而不是adminYanZheng.大写函数名。YanZheng改成storedPwd.
2.使用一个return,可以通过定义一个bool变量,原因是可以减少测试用例(如果只是要求语句覆盖的话).
3.catch的目的是屏蔽错误或者封装错误。e.ToString()完全没有意义。如果不需要封装Exception,那么去掉catch的参数。
4.return false去掉,原因参见2。
5.如果要更专业,请考虑使用ORM。
------解决方案--------------------
1. 公有方法名应该大写字母开头
2. 使用参数或者存储过程而不是拼接语句(防止SQL注入)
3. 如果com.ExecuteScalar()返回为null,那么com.ExecuteScalar().ToString();会报异常,可你的异常处理中e.ToString();毫无价值,不如删除
4. 最后的返回处理的也不太好
5. 变量名中英文混杂
6. 如果考虑安全性,密码应该加密

public bool ValidLogin(string sname,string pwd)
{
string adminSql= "select sname from admin where zname = @sname and pwd=@pwd ";
SqlCommand com=new SqlCommand(adminSql,con);
com.Parameters.Add( "@sname ").Value = sname;
com.Parameters.Add( "@pwd ").Value = @pwd;
con.Open();
SqlDataReader dr = com.ExecuteReader();
if(dr.Read())
{
return true;
}
return false;
}
------解决方案--------------------
注入?楼主的方法是取出密码再进行匹配怎么会有注入的漏洞呢?想不通啊。

2、觉得你的验证很奇怪,可这样:
SELECT COUNT(*) FROM [ADMIN] WHERE [zname] = @sname AND [pwd] = @pwd
当结果等于1,return true,否则 return false

这样的话我只要知道用户名。不用密码就可以啊。这才是注入的吧???????????????????????????

------解决方案--------------------
CREATE PROCEDURE dbo.UP_Admin_Login

(
@Ad_Name NVARCHAR(12),
@Ad_Pwd NVARCHAR(15)

)

AS
declare @result int
SELECT @result=COUNT(*) FROM Admin
WHERE Ad_Name=@Ad_Name AND Ad_Pwd=@Ad_Pwd
RETURN @result
GO

判断result是否> 0。

------解决方案--------------------
public bool adminYanzheng(string sname,string pwd)
{
//注入攻击可能存在,如传入sname=1 ' delete from admin where '1 '= '1
//应使用参数
//string adminSql= "select pwd from admin where zname= ' "+sname+ " ' ";
string adminSql= "select pwd from admin where zname=@zname ";
SqlCommand com=new SqlCommand(adminSql,con);
//然后使用参数传值
sqlparameter parm=new sqlparameter( "@zname ",sqldbtype.nvarchar,20);
parm.Value=sname;
com.parameters.add(parm);

con.Open();
//如果可能,尽量不要使用try
//string Yanzheng=null;
sqldatareader sdr=comm.executereader();
if(sdr.read()){
if(sdr[0].Equals(Yanzheng)){
return true;
}
else{
return false;
}
}
else{
return false;
}
//try
//{
//Yanzheng=com.ExecuteScalar().ToString();
//}
//catch(Exception e)