请教连接数据库

loadtt 2009-04-16 10:18:01
3个问题:

1、下面是一个简单的登录,不知道是不是我网速的问题,每次登录等待的时间都比较长(验证用户名密码)。
想实现在登录的时候,弹出个等待的提示窗体,直到验证完成,请问怎么做简单点?

2、下面这种连接数据库验证用户名密码的方法在效率和安全上是不是有问题?有没有更好的方法?

3、这样连接数据库会不会暴露连接地址、用户名和密码?如果会,有没有什么方法可以更安全点? ^_^

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using MySql.Data;
using MySql.Data.MySqlClient;

namespace test_mysql
{
public partial class login : Form
{
private string strTs = "出错";

public login()
{
InitializeComponent();
}


private void login_Load(object sender, EventArgs e)
{

}

//通用显示信息的函数
private void showMsg(string strNr)
{
MessageBox.Show(this, strNr, strTs, MessageBoxButtons.OK, MessageBoxIcon.Information);
}

//“退出”按钮的处理事件
private void butout_Click(object sender, EventArgs e)
{
this.Close();
}

private void butIn_Click(object sender, EventArgs e)
{
if (txtuser.Text.Trim() == "")
{
errlogin fm = new errlogin();
fm.Show();
return;
}
if (txtpass.Text.Trim() == "")
{
errlogin fm = new errlogin();
fm.Show();
return;
}
try
{

MySql.Data.MySqlClient.MySqlConnection cnn = new MySqlConnection("host=\;database=;uid=;pwd=");
string strSql = "select * from tb_user where username='" + txtuser.Text.Trim() + "' and password='" + txtpass.Text.Trim() + "'";
cnn.Open();
MySqlCommand cmm = new MySqlCommand(strSql, cnn);
MySqlDataAdapter da = new MySqlDataAdapter();
da.SelectCommand = cmm;
DataSet ds = new DataSet();
da.Fill(ds);
DataTableReader dr = ds.CreateDataReader();
if (dr.Read())
{
Form1 frm = new Form1();
frm.Show();
this.Hide();

}
else
{
errlogin fm = new errlogin();
fm.Show();
//showMsg("验证失败,请重新输入用户名和密码!");
txtuser.Focus();
}
cnn.Close();
}
catch (Exception ex)
{
showMsg("验证用户名和密码时发生错误,错误为:" + ex.Message);
}
}

}
}
...全文
110 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
teerhu 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jingshuaizh 的回复:]
string strSql = "select * from tb_user where username=@username and password=@password";

数据库存储的@password 是经过MD5加密的


用户登录后 就把 @password 进行MD5加密 然后 查询
把@username 和加密后的@password 作为参数 加入 哈西表
hastabletemp.add(@username,username);
hastabletemp.add(@password ,MD5password );

代码是 VB的 改一下就可以了
Public Overloads Shared Functi…
[/Quote]
支持一下


楼上的各位都已经都说得不错


建议你把连接字符串写到web.config里面
数据层相关语句封装成一个专门的类
sql语句用sqlparam传参
hubofly 2009-04-17
  • 打赏
  • 举报
回复
楼上说的都有道理,不过LZ最好去下载源码看看吧,你这样写,实在是不是很合适,其中包括连接字符串的写法和sql的拼装,还有sql的写法,都存在问题
018 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fengjian_428 的回复:]
string strSql = "select * from tb_user where username='" + txtuser.Text.Trim() + "' and password='" + txtpass.Text.Trim() + "'";

这样写容易被注入攻击的 换成sqlparam传参吧
[/Quote]

同意
loadtt 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fengjian_428 的回复:]
string strSql = "select * from tb_user where username='" + txtuser.Text.Trim() + "' and password='" + txtpass.Text.Trim() + "'";

这样写容易被注入攻击的 换成sqlparam传参吧
[/Quote]

请问具体怎么写?多谢
loadtt 2009-04-17
  • 打赏
  • 举报
回复
没人回答了,结贴
yagebu1983 2009-04-16
  • 打赏
  • 举报
回复
速度问题:可能是你的表设计有问题。。。也有可能是判断逻辑问题。。。
sushou2009 2009-04-16
  • 打赏
  • 举报
回复
同意是网速的问题。代码应该没什么问题,不过LZ可以考虑封装一下增加下安全性
java_renyusheng 2009-04-16
  • 打赏
  • 举报
回复
应该是网速的原因,代码没看出来会影响效率。你不用弹出窗体,在登陆页放个进度条控件就ok
不安全,用c#加密类进行密码加密,使用参数化防止注入攻击
蓝海D鱼 2009-04-16
  • 打赏
  • 举报
回复
string strSql = "select * from tb_user where username=@username and password=@password";

数据库存储的@password 是经过MD5加密的


用户登录后 就把 @password 进行MD5加密 然后 查询
把@username 和加密后的@password 作为参数 加入 哈西表
hastabletemp.add(@username,username);
hastabletemp.add(@password ,MD5password );

代码是 VB的 改一下就可以了
Public Overloads Shared Function FetchData(ByVal QryID As String, ByVal Parameters As Hashtable) As DataTable
Try
Dim strQuery As String = FetchQuery(QryID)

'Justin 31-Mar-05
If LCase(Left(strQuery, 3)) = "spr" Then 'Stored Procedure
Return ExecuteDataTable(strQuery, CommandType.StoredProcedure, Parameters)
Else
Return ExecuteDataTable(strQuery, CommandType.Text, Parameters)
End If

Catch eFetch As SqlHelperException
Throw eFetch
End Try
End Function

Private Overloads Shared Function ExecuteDataTable(ByVal SqlStr As String, ByVal cmdType As CommandType, _
ByVal SqlParameters As Hashtable) As DataTable

Dim sqlConn As New SqlConnection(getConnectionString)
Dim sqlCmd As New SqlCommand(SqlStr)
Dim sqlDA As New SqlDataAdapter
Dim dtSql As New DataTable

Dim strDebug As String 'Debuging

strDebug = " DML Statement " & ControlChars.CrLf & SqlStr & ControlChars.CrLf


Try
sqlConn.Open()

With sqlCmd
.Connection = sqlConn
.CommandType = cmdType
End With


If Not (SqlParameters Is Nothing) Then
Dim hsEnum As IDictionaryEnumerator = SqlParameters.GetEnumerator

With sqlCmd
While hsEnum.MoveNext
.Parameters.Add(hsEnum.Key, hsEnum.Value)

'For Debugging
If Not hsEnum.Value.GetType Is GetType(System.Byte()) Then
strDebug += hsEnum.Key & "=" & hsEnum.Value & ","
End If
End While
End With

End If



sqlDA.SelectCommand = sqlCmd

sqlDA.Fill(dtSql)

Return dtSql

Catch ExDB As SqlException
sqlConn.Close()
strDebug += ControlChars.CrLf & ExDB.Message
Throw New SqlHelperException(strDebug, ExDB)

Catch Ex As Exception
sqlConn.Close()
strDebug += ControlChars.CrLf & Ex.Message
Throw New SqlHelperException(strDebug, Ex)

Throw Ex
Finally
sqlConn.Close()
End Try
End Function 'ExecuteDataTable
wusenbo 2009-04-16
  • 打赏
  • 举报
回复
用一个类封装起来吧!!这样是容易暴露
fengjian_428 2009-04-16
  • 打赏
  • 举报
回复
string strSql = "select * from tb_user where username='" + txtuser.Text.Trim() + "' and password='" + txtpass.Text.Trim() + "'";

这样写容易被注入攻击的 换成sqlparam传参吧
wuyi8808 2009-04-16
  • 打赏
  • 举报
回复
txtpass.Text 应该用 MD5 或 SHA 之类的方法加密后再存放在数据库中,验证时也同样加密后比较。

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧