当前位置:  开发笔记 > 后端 > 正文

如何编辑'bit'数据类型?

如何解决《如何编辑'bit'数据类型?》经验,为你挑选了4个好方法。

我在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属性是位数据类型.此代码无效.我该怎么办呢?



1> 小智..:

我的儿子就读于你的学校.他的名字是:

罗伯特'); DROP TABLE学生; -

我们称他为小鲍比表.


好吧,我被告知这将被删除,因为不是答案,我需要摔倒剑或清理我自己的烂摊子.虽然我会保留
我的代表,如果它被删除我认为重要的是指出OP的代码中的漏洞(可能他的帐户安息吧).所以lemme精心设计......

让我们实际上将XKCD漫画中的上述名称修改为实际上对连接查询起作用的东西(假设OP的布尔问题已得到修复):

123; DROP TABLE学生; -

如果我们在sidnolabel文本框中添加它(或者它是什么;如果它在视图状态中你可以用一个简单的工具改变它),结果的连接查询是

update Student   
set send_mail = 1  
where student_id = 123; DROP TABLE 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开发者我都乐意接受你的帮助.


@Shef:在OP的情况下,表*是*`Student`

2> Scott Schult..:

尝试:

Convert.ToInt16(sendemailCheckBox.Checked)

一般来说,我用SqlParameters它,你可以指定一个SqlDbType.TinyInt.

这是一个使用sqlparameter的例子,它更好,因为它避免了SQL注入.

编辑:我刚刚注意到你在使用bit,而不是tinyint.不确定这是否有效.



3> Jason Berkan..:

要回答您的问题,只需将布尔值(即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> David..:

首先,以一切神圣的名义,至少PARAMETERIZE你的SQL代码.否则,您要求 SQL注入攻击.

其次,"bit"数据类型使用1表示True,0表示False.这就是SQL在分配值时想要看到的内容.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有