如何使用C#在MySQL数据库中创建用户输入名称的表
错误原因
MySQL中,单引号'仅用于包裹字符串类型的数值,表名属于SQL标识符,不能使用单引号包裹。你当前的代码用单引号包裹用户输入的表名,直接违反SQL语法规则,报错信息中提示的语法错误位置''test'就是单引号包裹的表名部分。
除此之外,直接拼接用户输入生成SQL语句存在极高的SQL注入风险,恶意用户可以构造特殊输入篡改SQL逻辑,造成数据泄露、数据丢失等严重安全问题。
解决方法
- 替换表名的包裹符号:将包裹表名的单引号替换为MySQL专门用于包裹标识符的反引号
`(键盘ESC键下方的按键),基础修改后的代码如下:
string createtable = $"CREATE TABLE `{email.Text}` (benutzung VARCHAR (20), passwort VARCHAR (30), id INTEGER);";
- 增加表名校验逻辑:在拼接SQL前对用户输入的表名做合法性校验,限制仅允许使用字母、数字、下划线,长度不超过64位,同时排除MySQL保留关键字,避免特殊输入触发语法问题或注入风险。
- 更安全的替代方案:不直接使用用户输入作为表名,新增一张元数据表存储用户输入和对应内部表名的映射关系,内部表名按固定规则生成,完全避免用户输入直接拼入SQL语句,从根源上规避注入风险。
内容的提问来源于stack exchange,提问作者Sarper Eroglu
相关产品推荐
相关产品推荐

