我在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
属性是位数据类型.此代码无效.我该怎么办呢?
我的儿子就读于你的学校.他的名字是:
罗伯特'); 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开发者我都乐意接受你的帮助.
尝试:
Convert.ToInt16(sendemailCheckBox.Checked)
一般来说,我用SqlParameters
它,你可以指定一个SqlDbType.TinyInt
.
这是一个使用sqlparameter的例子,它更好,因为它避免了SQL注入.
编辑:我刚刚注意到你在使用bit
,而不是tinyint
.不确定这是否有效.
要回答您的问题,只需将布尔值(即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
首先,以一切神圣的名义,至少PARAMETERIZE你的SQL代码.否则,您要求 SQL注入攻击.
其次,"bit"数据类型使用1表示True,0表示False.这就是SQL在分配值时想要看到的内容.