【问题标题】:How to edit 'bit' data type?如何编辑“位”数据类型?
【发布时间】:2009-10-22 15:43:58
【问题描述】:

我正在使用 Visual Basic 进行编码。我正在使用复选框控件。现在根据其选中的属性,我需要在 SQL Server 数据库中设置/取消设置位列。代码如下:

Try
    conSQL.Open()

    Dim cmd As New SqlCommand("update Student set send_mail = " + _
        sendemailCheckBox.Checked.ToString + " where student_id = '" _
        + sidnolabel.Text + "'", conSQL)

    cmd.ExecuteNonQuery()
Finally
    conSQL.Close()
End Try

send_mail 属性是位数据类型。此代码不起作用。 我该怎么办?

【问题讨论】:

    标签: .net asp.net database vb.net


    【解决方案1】:

    我儿子在你们学校就读。他的名字是:

    罗伯特');掉表学生; --

    我们称他为小 Bobby Tables。


    好的,有人告诉我这将被删除为not an answer,我需要自食其力或收拾自己的烂摊子。虽然我会保留
    如果我的代表被删除,我认为指出 OP 代码中的漏洞很重要(愿他的帐户安息) .所以让我详细说明...

    让我们将 XKCD 漫画中的上述名称实际修复为实际上可以对抗串联查询的名称(假设 OP 的布尔问题已得到修复):

    123;掉表学生; --

    如果我们在 sidnolabel 文本框中添加它(或其他任何内容;如果它处于视图状态,您可以使用简单的工具更改它),生成的连接查询是

    update Student   
    set send_mail = 1  
    where student_id = 123; DROP TABLE STUDENT; --'
    

    这将运行一个虚假查询,然后删除 Student 表。

    这就是“不好”的定义。

    OP 应该做的是使用参数化查询。这可以防止像这样的注入攻击。正在更新 OP 的代码...

    Try
        conSQL.Open()
        Dim cmd As New SqlCommand(
            "update Student " + _ 
            "set send_mail = @sendMail " + _
            "where student_id = @studentId", conSQL)
        cmd.Parameters.Add( _
            "@sendMail", SqlDbType.Bit).Value = _
                sendemailCheckBox.Checked
        cmd.Parameters.Add( _
            "@studentId", SqlDbType.NChar, 25).Value = _
                 sidnolabel.Text ' better to keep track of this in the Session!
        cmd.ExecuteNonQuery()
    Finally
        conSQL.Close()
    End Try
    

    这应该解决 OP 的问题防止 sql 注入攻击。不是吗?

    *请注意,我不是VB,也没有经过测试。任何想要编辑和修复错误的 VB.NET 开发人员都将很乐意接受您的帮助。

    【讨论】:

    【解决方案2】:

    试试:

    Convert.ToInt16(sendemailCheckBox.Checked)
    

    一般情况下,我为此使用SqlParameters,您可以指定SqlDbType.TinyInt

    Here 是一个使用 sqlparameter 的示例,它更好,因为它避免了 SQL 注入。

    编辑:我刚刚注意到您使用的是bit,而不是tinyint。不确定这是否可行。

    【讨论】:

      【解决方案3】:

      要回答您的问题,只需为数据库中的位列分配一个布尔值(即sendemailCheckBox.Checked)。

      为了帮助您解决 SQL 注入问题 - 不要将用户输入直接写入 SQL 字符串。您必须使用参数来确保用户不会弄乱您的数据库。你的代码应该这样写:

      Using conSQL As New SqlConnection("SomeConnectionString")
         conSQL.Open()
         Using cm as SqlCommand = conSQL.CreateCommand()
            cm.CommandType = CommandType.Text
            cm.CommandText = "UDPATE Student SET send_mail = @send_mail WHERE student_id = @student_id"
            cm.Parameters.AddWithValue("@send_mail", sendemailCheckBox.Checked)
            cm.Parameters.AddWithValue("@student_id", sidnolabel.Text)
      
            cm.ExecuteNonQuery()
         End Using
      End Using
      

      【讨论】:

        【解决方案4】:

        首先,以一切神圣的名义,至少参数化您的 SQL 代码。否则,您要求进行 SQL 注入攻击。

        其次,“位”数据类型使用 1 表示 True,使用 0 表示 False。这就是 SQL 在您分配值时希望看到的内容。

        【讨论】:

          【解决方案5】:

          井位数据类型相当于 C# 或 Visual Basic 中的布尔值,因此您可以简单地为这些类型分配真或假值,然后可以更新数据库中的记录。

          【讨论】:

          • 这个。还有,邪恶的 sql 就是邪恶的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-27
          相关资源
          最近更新 更多