请兄弟姐妹们帮我写的登陆代码减减肥~!

weiqiaoxyz 2006-10-31 05:01:12
private void Button1_Click(object sender, System.EventArgs e)
  {
if(Session["UserId"]!=null)
{
Response.Write("你现在的状态为已登陆,请不要重复登陆");
Response.End();
}
  string UserName = CleanString.htmlInputText(this.UserName.Text);
  string UserPass = CleanString.htmlInputText(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(this.UserPass.Text,"md5"));
  string Xyz = this.IntXyx.Text;
  string XyzCode=System.Web.HttpContext.Current.Request.Cookies["checkCode"].Value;
if(Xyz!=XyzCode)
{
Response.Write("<script>alert('验证码输入有误!');history.go(-1);</script>");
}
  SqlConnection conn=DB.createConnection();
  conn.Open();

  SqlCommand cmd=new SqlCommand("select * from UserTable where UserName='"+UserName+"'",conn);
  SqlDataReader sdr=cmd.ExecuteReader();

  if(sdr.HasRows)
{
sdr.Read();
string Mpass=sdr["UserPass"].ToString();
if(UserPass!=Mpass)
{
Response.Write("<script>alert('用户输入密码错误!');history.go(-1);</script>");
}
else
{
Session["UserId"]=sdr["UserId"].ToString();
sdr.Close();

SqlCommand cmdone=new SqlCommand("update UserTable set LoginTime='"+System.DateTime.Now.ToString()+"',LoginAdd='"+Request.UserHostAddress.ToString()+"' where UserName='"+UserName+"'",conn);
cmdone.ExecuteNonQuery();

Response.Redirect("../WebUser/Main.aspx");
}
}
else
{
Response.Write("<script>alert('没有此用户,请检查用户名是否正确!');history.go(-1);</script>");
}
conn.Close();
}

上面的代码执行过程中任何错误没有,可以正常合作,但老感觉太过"肥"了
而且不是很稳定,在极少情况下会出现连接池超出范围

请兄弟姐妹们,各位大哥帮帮忙,看看

五十分相送!!来者有分!!!!!!
...全文
451 28 打赏 收藏 举报
写回复
28 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
stone3_hl 2006-11-01
  • 打赏
  • 举报
回复
可以看看经典的Duwamish例子,可以帮你快速转到.Net风格上来...
zdyguilong 2006-11-01
  • 打赏
  • 举报
回复
帮顶一下,确实看着比较肥,高手们说了用存储过程
weiqiaoxyz 2006-11-01
  • 打赏
  • 举报
回复
TO:winner2050(winner)
能不能说说,哪儿有漏洞?

TO:haolaiwu(夜风)
这个也是一种减肥方法,

TO:job_2006(初学.net)
能否提供点资料?
job_2006 2006-11-01
  • 打赏
  • 举报
回复
用存储过程吧,并且在成功登录后,马上更新其状态,不用两次连接数据库操作咯
稍微有点无敌 2006-11-01
  • 打赏
  • 举报
回复
Response.Write("<script>alert('验证码输入有误!');history.go(-1);</script>");
写成一个方法啊,
public static alert(string ErroString)
{
Response.Write("<script>alert(ErroString);history.go(-1);</script>");
}

数据库操作部分建议分层,用存储过程
weiqiaoxyz 2006-11-01
  • 打赏
  • 举报
回复
怎么没人帮忙啊,我顶~!
xiaoyu4215 2006-11-01
  • 打赏
  • 举报
回复
使用web2.0登陆组建 你就没必要这么麻烦了
weiqiaoxyz 2006-11-01
  • 打赏
  • 举报
回复
楼上大哥,帮忙讲一下好吗,小弟先行谢过~!
winner2050 2006-11-01
  • 打赏
  • 举报
回复
if(Session["UserId"]!=null)
{
Response.Write("你现在的状态为已登陆,请不要重复登陆");
Response.End();
}

根本没有必要。

登录验证有SQL注入漏洞,根本不用密码就能进入。
weiqiaoxyz 2006-11-01
  • 打赏
  • 举报
回复
daishengs(横舟摆渡)
SqlCommand cmd=new SqlCommand("select * from UserTable where UserName='"+UserName+"' AND UserPass='"+ UserPass +"' ",conn);

放在一起不行吗,如果找不到就提示,登录出错。

==================================================================
放在一起是简单省事了许多,因为ASP中,用户名和密码同时进行判断,很容易引起SQL注入漏洞

不知道.NET中会不会引起这样的后果?
weiqiaoxyz 2006-11-01
  • 打赏
  • 举报
回复
多谢~!

散分咯~!
周公 2006-11-01
  • 打赏
  • 举报
回复
你厉害!
为什么不提供一个函数,重构一下代码呢?
把连接放在aspx里面可不是好习惯。
supergyc 2006-11-01
  • 打赏
  • 举报
回复
使用web2.0登陆组建 你就没必要这么麻烦了
songsu 2006-11-01
  • 打赏
  • 举报
回复
请原谅我的自私,CSDN上面显示的太丑了,我发到我的小坛子里面了,你可以去看看,代码是一样的,显示的稍微好一点
http://www.xproer.com/bbs/topic.aspx?TopicID=194&ForumID=334&ForumName=.NET开发技术&TopicName=优化的登陆后台登陆代码
songsu 2006-11-01
  • 打赏
  • 举报
回复
using System.Web.Security;
using System.Web;

const string sql = "select ID from UserTable where UserName=@UserName and PassWord=@PassWord;";
const string sql_updateLogin = "update UserTable set LoginTime=@LoginTime,LoginAdd=@LoginAdd where UserID=@UserID";

private void Button1_Click(object sender, System.EventArgs e)
{
if(Session["UserId"]!=null)
{
Response.Write("你现在的状态为已登陆,请不要重复登陆");
}
  string UserName = CleanString.htmlInputText(this.UserName.Text);
  string UserPass = CleanString.htmlInputText(FormsAuthentication.HashPasswordForStoringInConfigFile(this.UserPass.Text,"md5"));
  string Xyz = this.IntXyx.Text;
  string XyzCode = Request.Cookies["checkCode"].Value;
if(Xyz!=XyzCode)
{
Response.Write("<script>alert('验证码输入有误!');history.go(-1);</script>");
}
  SqlConnection conn = DB.createConnection();
  SqlCommand cmd = new SqlCommand(sql,conn);
cmd.Parameters.Add("@UserName",SqlDbType.Vchar,20);
cmd.Parameters.Add("@PassWord",SqlDbType.Vcar,20);
cmd.Parameters["@UserName"].Value = UserName;
cmd.Parameters["@PassWord"].Value = UserPass;
  conn.Open();
object uid = cmd.ExecuteScalar();
//用户存在
  if(uid != null)
{
Session["UserId"] = uid;
cmd.Parameters.Clear();//清空所有变量
//更新登陆时间
cmd.CommandText = sql_updateLogin;
cmd.Parameters.Add("@LoginTime",SqlDbType.SmallDataTime);
cmd.Parameters.Add("@LoginAdd", SqlDbType.Vchar);
cmd.Parameters.Add("@UserID", SqlDbType.Integer);
cmd.Parameters["@LoginTime"].Value = DateTime.Now;
cmd.Parameters["@LoginAdd"].Value = Request.UserHostAddress.ToString();
cmd.Parameters["@UserID"].Value = uid;
cmd.ExecuteNonQuery();
conn.Close();
cmd.Dispose();
Response.Redirect("../WebUser/Main.aspx");
}//用户不存在
else
{
conn.Close();
cmd.Dispose();
Response.Write("<script>alert('用户名或密码错误!');history.go(-1);</script>");
}
}

//几点说明
(1)CleanString.htmlInputText这个函数里面最好过滤掉一些SQL敏感字符,另外还判断一下用户名密码是否为空。
weiqiaoxyz 2006-11-01
  • 打赏
  • 举报
回复
多谢兄弟们的捧场

其中winner2050(winner)提到说不用密码也能登陆了

难道我写的这个代码中有什么注入漏洞么?

能否给个提示?
alan 2006-11-01
  • 打赏
  • 举报
回复
頂....
  • 打赏
  • 举报
回复
同上!~~~~
aak9908021 2006-11-01
  • 打赏
  • 举报
回复
建议使用存储过程,并将比对的方法独立出去,这边调用。
blue_summer 2006-11-01
  • 打赏
  • 举报
回复
if(Session["UserId"]!=null)
{
exit sub
}

这样不就省事多了么?
加载更多回复(8)
发帖
.NET社区

6.1w+

社区成员

.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
帖子事件
创建了帖子
2006-10-31 05:01
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。