我有一个表单,用户可以在我的大学预订房间。我想验证用户输入以避免SQL注入(我的程序使用MS Access数据库)并且还在其名称中停止数字和synbols等。
我可以很好地进行验证,但是只有在所有验证测试都恢复为真的情况下才会进行大量验证,然后执行方法。我确实有这样的事情:
If txtName.Text = "" Then
frmBookErr.SetError(txtName, "Name field cannot be left blank.")
fail = 1
Else
frmBookErr.SetError(txtName, "")
fail = 0
End If
然后检查fail
变量,但如果其中一个验证测试恢复为真,那么它稍后会在表单中被覆盖。
任何人都可以提供一些输入吗?感谢。
答案 0 :(得分:1)
如果要避免SQL注入,请使用参数化SQL查询或存储过程,不要通过连接构造SQL。
答案 1 :(得分:1)
将过程开始时的失败变量设置为0,然后仅在出现故障时将其设置为1 ...
fail = 0
If txtName.Text = "" Then
frmBookErr.SetError(txtName, "Name field cannot be left blank.")
fail = 1
End If
If txtSomethingElse.Text = String.Empty Then fail = 1
If fail = 0 Then frmBookErr.Clear()
答案 2 :(得分:0)
为避免SQL注入,您需要使用不直接允许更改SQL查询的内容。
现在这并不意味着您无法提供值,这意味着您强烈指定要处理到服务器的类型。
string commandText = "SELECT * FROM Customers "+
"WHERE Country=@CountryName";
SqlCommand cmd = new SqlCommand(commandText, conn);
cmd.Parameters.Add("@CountryName",countryName);
不是将countrName作为concated string提供,而是实际告诉您的Sql Command您将其作为参数提供,它不允许查询本身的任何更改。