从字符串“”到“布尔”类型的转换无效

时间:2014-03-24 19:56:42

标签: asp.net vb.net login

我在ASP.NET中的登录表单上的标题中收到错误消息有没有人知道我该如何解决它?非常感谢帮助

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  Dim conn As New MySqlConnection

  conn.ConnectionString = ("server=localhost;port=3307;user=user;password=password;database=DB;")

  Try

    Dim SQL As String = "select * from users3 where uname = '" & txtUName.Text & "' AND password = '" & txtPwd.Text & "'"

    conn.Open()

    Dim cmd As New MySqlCommand(SQL, conn)
    Dim reader As MySqlDataReader = cmd.ExecuteReader

        reader.Read()
        Dim isValidLogin As Boolean
        Boolean.TryParse(reader.GetValue(1), isValidLogin)

        If isValidLogin Then
            Session("UserName") = txtUName.Text
      Response.Redirect("REGISTERPROP.aspx")
    Else
      Response.Write("Invalid Login")
    End If

  Catch ex As Exception
    Response.Write("An Error Occurred: " & ex.Message.ToString())
  End Try
End Sub

2 个答案:

答案 0 :(得分:1)

变化:

Dim isValidLogin = reader.GetValue(1)

为:

Dim isValidLogin As Boolean
Boolean.TryParse(reader.GetValue(1), isValidLogin)

答案 1 :(得分:1)

嗯,这条消息几乎是不言自明的。您正在尝试将空(零)字符串转换为布尔值。 Boolean唯一有效的字符串值是(不区分大小写)truefalse。你有其他问题。

  • 如果找不到用户/密码,您的查询将返回0行(空集),如果找到用户/密码,则(大概)返回1行。但是,您没有检查Read()方法的返回值:如果读取了行并且true,则返回false otherwise。您的查询仅在成功匹配时返回一行:您应该在尝试从中检索数据之前检查该行。

  • 此外,您的查询存在SQL Injection漏洞。考虑使用参数化查询或存储过程。如果有人在密码字段中输入(或简单地发布)回到您的页面,您认为可能会发生什么:

    ; drop table users3 ;
    
  • 您似乎在数据库中以明文形式存储密码。与您的SQL注入漏洞一起使用,您可以让您的系统和用户受到威胁。考虑使用像SHA-256这样的secure hashing algorithm来保存密码并对盐渍密码进行哈希处理。

将您的查询更改为

`select 'true' from user3 where ...`

使用DbReader.ExecuteScalar()执行它,如果结果集为空,则返回结果集第一行的第一列或null。然后你的逻辑变得更简单了,比如

Dim isValidLogin = cmd.ExecuteScalar()
If isValidLogin IsNot Nothing And isValidLogin Then
  Session("UserName") = txtUName.Text
  Response.Redirect("REGISTERPROP.aspx")
Else
  Response.Write("Invalid Login")
End If