验证数据库中的凭据

时间:2014-09-14 21:08:42

标签: database vb.net

我对我的代码感到困惑:

Dim sqladapter As SqlDataAdapter = New SqlDataAdapter()
Dim sqlcmd As SqlCommand = New SqlCommand()
sqlcmd = New SqlCommand("SELECT login, pass from Table1 where login=" & login.Text & "and pass='" & password.Text.ToString() & "';", connect)
Dim dr As SqlDataReader = sqlcmd.ExecuteReader()
Dim dt As DataTable = New DataTable()
dt.Load(dr)
If (dt.Rows.Count = 1) Then
'Display welcome page or do some action here.

现在,我的问题是,还有其他方法可以做Rows.Count == 1。我觉得这是非常错误的,没有任何意义。

如何从数据库验证用户在表中只有一个有效记录而非计算行。

提前致谢:)

(报告问题前请问我)

2 个答案:

答案 0 :(得分:2)

你有两个问题,一个被称为Sql Injection,你已经有很多链接可以解释为什么真的很糟糕。另一个是存储在数据库中的纯文本密码。这是一个很大的安全问题,因为每个有可能查看数据库的人都可以看到用户的密码。 (当然,这种情况的重要性与应用程序的性质有关,但不能被淡化)See this link以获得关于如何散列字符串(密码)并获取其加密版本以存储在数据库中的答案而不是纯文本。

最后,您可以更改所使用的代码,以避免使用SqlDataAdapterDataTable 只需对ExecuteScalar查询使用IF EXIST,如果用户/密码存在,则只返回1,否则返回0

Dim cmdText = "IF EXISTS(SELECT 1 FROM Table1 WHERE login = @log AND pass = @pwd) " & _
              "SELECT 1 ELSE SELECT 0"
using connect = new SqlConnection(connectionstring)
using sqlcmd = New SqlCommand(cmdText, connect)
    connect.Open()
    sqlcmd.Parameters.AddWithValue("@log", login.Text)
    sqlcmd.Parameters.AddWithValue("@pwd", password.Text) ' <- Subst with a call to an hash function 
    Dim exists = Convert.ToInt32(sqlcmd.ExecuteScalar())
    if exists = 1 Then
         'Display welcome page or do some action 
    else

    end if
End Using
End Using

答案 1 :(得分:0)

只有一种方法可以回答这个问题及其计算行数。不同的解决方案是在数据库中计算它们。例如,您可以编写带有用户名和密码的存储过程,并返回布尔值,这样您就可以拖动更少的数据。

作为旁注,您的代码中可能存在SQL注入。您不应该在数据库中存储清除密码。您应该返回整行并将数据库中的密码哈希值与从UI获得的paasword的哈希值匹配。