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

C++ Forms登录程序MySQL注入漏洞修复方案咨询

修复C++/Forms MySQL登录程序的SQL注入漏洞

嘿,这个问题太典型了——直接把用户输入拼进SQL语句里,简直是给SQL注入开了大门!你现在的代码把Tb1->Text和Tb2->Text直接拼接进SELECT语句,攻击者只要输入像你举的'=''or' / xxx' or 1=1 -- 这种恶意字符串,就能轻松绕过登录验证,甚至可能篡改数据库里的数据。

核心解决方案:使用参数化查询

预防SQL注入的标准做法是参数化查询,它让数据库把用户输入当作纯数据处理,而不是SQL指令的一部分。修改你的代码如下:

// 注意:这里把命令对象的变量名改成了cmd,避免和连接对象重名(你原来的代码里第二个参数写的connect应该是连接对象,建议命名为connection)
MySqlCommand^ cmd = gcnew MySqlCommand(
    "SELECT * FROM Learn.project1 where user=@username and password=@userpassword", 
    connection
);

// 绑定参数,将用户输入与SQL占位符关联
cmd->Parameters->AddWithValue("@username", this->Tb1->Text);
cmd->Parameters->AddWithValue("@userpassword", this->Tb2->Text);

为什么这样能修复漏洞?

  • 我们用@username和@userpassword作为占位符,代替了原来直接拼接的用户输入。
  • 数据库会自动处理输入中的特殊字符(比如单引号、斜杠),不会把它们解析成SQL语法的一部分,从根源上阻断了注入攻击的可能。

额外的安全建议

  • 不要存储明文密码:直接把密码存在数据库里是非常危险的!应该存储密码的哈希值(比如使用bcrypt、SHA-256等哈希算法),验证时将用户输入的密码哈希后,再和数据库中的哈希值对比。
  • 检查变量命名:你原来的代码里命令对象和连接对象都用了connect,这会导致编译错误,建议给连接对象命名为connection,命令对象用cmd之类的名称,提高代码可读性。

内容的提问来源于stack exchange,提问作者Ahmad zaki indra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:19:07