2013-05-14 42 views
0

我在两个不同的表用户表和带表创建一个问题查询:加入查询VB.net DataReader的

cmd.CommandText = "SELECT zone_name, zone_difference FROM user_master INNER JOIN zones on user_master.zone_id = zones.ID WHERE user_master.uname LIKE " & """" & usr_gl & """" 

Dim reader_q As OleDbDataReader 

reader_q = cmd.ExecuteReader() 

这里,区域名称和差异是由区表和zone_id(顾客)和ID (区域)有关系,用户名(uname)也是来自外部,例如usr_gl变量“admin”

这是说没有给出一个或两个参数的值。我检查了所有的表格列和数据。相同的查询独立于Access数据库运行。

我在这里执行有什么问题吗?

+0

'usr_gl'的运行时值可能是将参数语法元素注入查询并混淆查询解析器?即使您认为您可以控制输入值,使用类似字符串连接来构建数据库查询也是非常危险的。如果您修复SQL注入漏洞并使用参数化查询,问题是否会持续存在? – David 2013-05-14 12:23:10

回答

0

是的,你正在试图连接字符串,这是一个NO-NO代码

cmd.CommandText = "SELECT zone_name, zone_difference FROM " & _ 
        "user_master INNER JOIN zones on user_master.zone_id = zones.ID " & _ 
        "WHERE user_master.uname LIKE ?" 

cmd.Parameters.AddWithValue("@p1", usr_gl) 
Dim reader_q As OleDbDataReader 
reader_q = cmd.ExecuteReader() 

字符串连接被认为是不好的做法,因为很多问题都与 正确的字符串格式出现(带引号,小数点,日期)是第一个问题,但Sql Injection是最糟糕的。使用参数化查询应该可以避免所有这些问题