【问题标题】:Conversion from string "" to type 'Boolean' is not valid从字符串“”到类型“布尔”的转换无效
【发布时间】:2014-03-24 19:56:42
【问题描述】:

我在 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

【问题讨论】:

  • 问题已经解决了,我认为因为我不再收到错误消息,但是现在我得到这个“在调用 Read() 之前访问字段的尝试无效”在 asp.net 上真的很弱并且非常感谢您的帮助!
  • 请将此问题设置为已回答并在发布当前代码时提出新问题。

标签: asp.net vb.net login


【解决方案1】:

变化:

Dim isValidLogin = reader.GetValue(1)

到:

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

【讨论】:

  • 谢谢,我现在收到此错误消息“在调用 Read() 之前尝试访问字段无效”您有什么想法吗?感谢您的帮助!
  • 您仍然可以调用 reader.Read(),对吗?而且这还是在isValidLogin声明之前?
  • 是的,它看起来像这样: Dim reader As MySqlDataReader = cmd.ExecuteReader reader.Read() Dim isValidLogin As Boolean Boolean.TryParse(reader.GetValue(1), isValidLogin) If isValidLogin Then会话(“用户名”)= txtUName.Text
【解决方案2】:

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

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

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

    ; drop table users3 ;
    
  • 您似乎将密码明文存储在数据库中。结合您的 SQL 注入漏洞,您可以让自己的系统和用户受到威胁。考虑使用 secure hashing algorithm 像 SHA-256 对密码进行加盐处理并散列加盐密码。

将您的查询更改为

`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

【讨论】:

  • 我知道我的代码容易受到 SQL 注入的影响,之后我会处理这个问题……我的主要目标是让这个登录表单能够正常工作,我必须在明天上大学时提交这个,如果我不能让它工作我会失败,我在强调我在 asp.net 上很弱,我根本无法让表单工作..看看我的完整代码你能告诉我它应该是什么样子吗?它工作吗?你不会相信我会有多充实!
  • 我不是 VB.Net 的人,所以我是错误的资源 :D
  • 无论如何感谢您的帮助,这让我很沮丧,我现在不是编码员,所以我发现这真的很难,尤其是当它影响我的成绩时:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 2013-10-31
  • 2011-07-30
  • 2015-02-09
相关资源
最近更新 更多