You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:02:19