使用OLEDB连接(.NET)时SQL注入语法错误问题排查
问题分析与解决
为什么value #和--注释会报错?
- Access(ACE/Jet引擎)的SQL语法不支持
#作为注释符号,#在Access SQL中是用来包裹日期/时间常量的(比如#2024-05-20#),输入value #会让SQL解析器误认为你要编写日期常量,直接触发语法错误。 - Access SQL也不兼容
--行注释语法,这是MySQL、SQL Server等数据库的注释规则,Access无法识别,因此使用--同样会导致无效SQL语法。
正确的Access SQL注入注释方法
要截断Access的SQL语句,需使用Access原生支持的注释方式:
- 用单引号
'作为行注释:输入用户名时可以写value' OR '1'='1' '(末尾的单引号加空格会将后续SQL内容转为注释) - 用
REM关键字:输入用户名value' REM,后续的AND mypassword ='xxx'会被当作注释忽略
你之前修改的SQL语句因为用了Access不支持的--,所以报错。换成单引号注释的方式就能正常截断语句。
关键提醒:杜绝字符串拼接SQL
你的代码存在极高的SQL注入风险,正确的做法是使用参数化查询彻底规避注入问题,示例代码如下:
OleDbConnection Con = new OleDbConnection(); Con.ConnectionString = @"provider=microsoft.ACE.oledb.12.0;data source=" + Server.MapPath("") + @"\database.accdb"; Con.Open(); // 采用参数化查询,避免SQL注入 string sqlstring = "select * from users WHERE myusername = ? AND mypassword = ?"; OleDbCommand Cmd = new OleDbCommand(sqlstring, Con); // 添加参数,注意参数顺序需与SQL中的?对应 Cmd.Parameters.AddWithValue("@username", InputUserName.Text); Cmd.Parameters.AddWithValue("@password", InputPassWord.Text); OleDbDataReader dr1 = Cmd.ExecuteReader(); if (dr1.HasRows) { dr1.Read(); Response.Redirect("connectionSuccesful.aspx"); } else Label1.Text = "not valid username or password";
内容的提问来源于stack exchange,提问作者Ido Shemi
相关产品推荐
相关产品推荐

