SQL Reader的字符串问题?

时间:2020-03-06 15:00:17  来源:igfitidea点击:
Function FillAdminAccount() As Boolean

    FillAdminAccount = True

           Try

        SQLconn.ConnectionString = "connect timeout=9999999;" & _
                                   "data source=" & DefaultIserver & ";" & _
                                   "initial catalog=" & DefaultIdBase & "; " & _
                                   "user id=userid;" & _
                                   "password=userpass;" & _
                                   "persist security info=True; " & _
                                   "packet size=4096"
        SQLconn.Open()

        SQLcmd.CommandType = CommandType.Text

        SQLcmd.CommandText = "Select distinct username, cast(convert(varchar,userpassword) as varchar) as 'userpassword' from " & tblUsersList & " where usertype='MainAdmin'"
        SQLcmd.Connection = SQLconn

        SQLreader = SQLcmd.ExecuteReader

        While SQLreader.Read = True
            CurrentAdminUser = SQLreader("username").ToString
            CurrentAdminPass = SQLreader("userpassword").ToString   'PROBLEM'
        End While

    Catch ex As Exception
        ErrorMessage(ex)
    Finally
        If SQLconn.State = ConnectionState.Open Then SQLconn.Close()
        If SQLreader.IsClosed = False Then SQLreader.Close()
    End Try

End Function    'FillAdminAccount

请查看带有注释问题的行。在此代码上,输出等于" userpassword。如我们所见,右侧没有引号,我不知道为什么。顺便说一下,数据库中userpassword的数据类型为BINARY。我在此。谢谢..x_x

解决方案

可能是

as varchar) as 'userpassword'

应该

...as varchar) as [userpassword] ..

或者

...as varchar) as userpassword ..

切勿将实际密码存储在数据库中。现在看来,由于转换/广播操作,密码可能不是纯文本,但是我们仍然遇到问题。至少使用的任何加密都是易于逆转的,并且如果sql服务器最终与应用程序不在同一台计算机上,则密码将以纯文本形式通过网络传输。

如果必须执行此操作(可能是由于旧系统或者以上命令所致),则至少要在服务器上进行匹配,以使密码永远不会回到应用程序中。

我们应该做的是使用类似SQL Server 2005的HashBytes()函数之类的方法来仅存储实际密码的哈希值。当有人尝试登录时,对尝试输入的密码进行哈希处理并匹配哈希值。

关于特定问题,我的猜测是强制转换或者转换操作失败,导致NULL值返回到应用程序。而且,我们是否同时拥有相同类型的CAST()和CONVERT()?这是多余的。

@Oglester是正确的,它是'userpassword'周围的单引号。

这不是错误,但只是愚蠢的:

cast(convert(varchar,userpassword) as varchar

我们可以使用强制转换或者转换,但两者都没有意义。