我在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
属性是位数据类型。此代码无效。
我该怎么做呢?
答案 0 :(得分:52)
我儿子就读于你的学校。他的名字是:
罗伯特'); DROP TABLE学生; -
我们称他为小鲍比表。
好的,我被告知这将被删除为not an answer并且我需要落剑或清理我自己的烂摊子。虽然我会保留
我的代表,如果它被删除我认为重要的是指出OP的代码中的漏洞(可能他的帐户安息吧)。所以详细说明......
让我们实际上将XKCD漫画中的上述名称修改为对连接查询实际起作用的内容(假设OP的布尔问题已修复):
123; DROP TABLE学生; -
如果我们在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开发者我都乐意接受你的帮助。
答案 1 :(得分:6)
尝试:
Convert.ToInt16(sendemailCheckBox.Checked)
一般情况下,我使用SqlParameters
进行此操作,您可以指定SqlDbType.TinyInt
。
Here是使用sqlparameter的一个例子,它更好,因为它避免了SQL注入。
编辑:我刚刚注意到您使用的是bit
,而不是tinyint
。不确定这是否有效。
答案 2 :(得分:6)
要回答您的问题,只需将一个布尔值(即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
答案 3 :(得分:5)
首先,以一切神圣的名义,至少PARAMETERIZE你的SQL代码。否则,您要求进行SQL注入攻击。
其次,“bit”数据类型使用1表示True,0表示False。这就是SQL在分配值时想要看到的内容。
答案 4 :(得分:1)
井位数据类型相当于C#或Visual Basic中的布尔值,因此您可以简单地为这些类型指定true或false值,然后可以更新数据库中的记录。