【问题标题】:facing problem while executing vb.net query执行 vb.net 查询时遇到问题
【发布时间】:2011-04-29 14:19:34
【问题描述】:
Dim con As SqlConnection
        con = New SqlConnection("server=chinna; uid=sa; pwd=136018@h; database=icms")
        con.Open()
        Dim cmd As SqlCommand
        cmd = New SqlCommand("select pass from personal where idno=" & TextBox1.Text, con)
        cmd.CommandType = CommandType.Text
        Dim rdr As SqlDataReader
        rdr = cmd.ExecuteReader
        If rdr.Read() Then

            TextBox2.Text = rdr.ToString()
            Response.Redirect("default.aspx")
        Else
            MsgBox("incorrect password")

【问题讨论】:

  • 你有一个 SQL 注入漏洞。
  • 您面临什么问题?尽管您已经可以发现一些错误,但您提供的信息很少,但提供更多信息并不是一件坏事。
  • 你应该为你的文本框命名。
  • 不要以纯文本形式存储密码!
  • 我也会删除你的用户名和密码,我已经做到了,但它永远在这个编辑的历史中:(

标签: vb.net


【解决方案1】:

您需要在查询中使用参数:

cmd = New SqlCommand("select pass from personal where idno=@param", con)
cmd.Parameters.AddWithValue("param", TextBox1.Text);

【讨论】:

    【解决方案2】:

    使用ExecuteScalar 而不是ExecuteReader

    Dim password As String
    password = cmd.ExecuteScalar.ToString()
    

    仅供参考,以纯文本形式存储密码并进行比较是非常糟糕的做法。您应该使用一些单向加盐加密来加密密码,然后在验证时执行相同的操作,然后比较加密的值。

    【讨论】:

    • 是的,但是你应该迭代阅读,而不仅仅是将其转储到字符串中。
    • +1 表示坚持回答,以后只评论(OMG VERY)糟糕的编码实践。
    【解决方案3】:

    您缺少数据源分配。

    在调用 DataBind 之前添加 GridView1.DataSource = rdr

    您的 If 块应如下所示:

    If rdr.Read() Then  
     GridView1.Visible = True             
     GridView1.DataSource = rdr
     GridView1.DataBind()           
    End If 
    

    【讨论】:

      【解决方案4】:

      应该是

      cmd = New SqlCommand("select pass from personal where idno='" & TextBox1.Text & "'", con)
      

      在 ASP.net 上似乎没有该代码。我们无法在客户端浏览器上出现的 VB.net 中执行 MsgBox。

      【讨论】:

      • 加上引号会使其工作,但会留下 SQL 注入攻击漏洞。如果文本框中的文本包含一个 ',那么你可能会遇到真正的麻烦,即文本 "test';DROP TABLE personal;GO'"
      【解决方案5】:

      在 rdr 上使用 HasRows 并为 GridView1 设置 DataSource

          Dim rdr As SqlDataReader
          rdr = cmd.ExecuteReader()
          If rdr.HasRows Then
              GridView1.Visible = True
              GridView1.DataSource = rdr
              GridView1.DataBind()
          End If
      

      【讨论】:

        【解决方案6】:

        你的错误是什么,或者你只是为 rdr 得到一个空值?

        我没有看到输出参数。您必须有一个。你只有一个输入参数。

        【讨论】:

        • 您不需要输出参数来获取 SELECT 查询的结果。查询的结果就是输出。
        【解决方案7】:
        1. 您需要使用会话变量或登录身份以某种方式标记用户已登录。否则,任何人都可以通过直接导航到该页面的登录版本。
        2. MsgBox( 在 asp.net 中无效,因为它会在服务器上显示一条消息,而不是在客户端上。尝试在页面上使用Label,通过设置其文本来显示错误消息。
        3. 您遇到了什么问题?它只是“不起作用”吗?它不能正确验证您的密码吗?你有某种例外吗?可以发布结果吗?

        【讨论】:

          猜你喜欢
          • 2016-05-08
          • 1970-01-01
          • 2023-01-31
          • 2013-02-08
          • 1970-01-01
          • 1970-01-01
          • 2012-07-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多