PHP+MySQL企业注册表单表名漏洞及SQL注入问题求助
问题解决:企业注册表单的SQL语法错误与注入漏洞修复
一、语法错误原因及修复
输入“out”报错是因为out是MySQL的保留关键字,直接作为表名会触发SQL语法错误。解决方法是用MySQL的反引号(`)包裹表名,不管是不是保留字,都用反引号包裹就能避免这类问题。
二、SQL注入漏洞修复
由于CREATE TABLE、INSERT INTO这类语句中的表名无法通过参数绑定(bind_param)处理,所以需要对用户输入的企业名称做严格校验和过滤:
- 第一步:去除空格后,过滤非法字符,只允许字母、数字和下划线(可根据业务需求调整规则)
- 第二步:对处理后的表名用反引号包裹,进一步规避注入风险
三、修改后的完整代码示例
// 处理企业名称:去除空格 + 过滤非法字符 $company = str_replace(' ', '', $_POST["company"]); // 只保留字母、数字和下划线,过滤其他字符 $company = preg_replace('/[^a-zA-Z0-9_]/', '', $company); // 过滤后为空则终止,避免非法输入 if(empty($company)){ die("企业名称包含非法字符,请重新输入"); } // 哈希密码 $password_hash = password_hash($_POST["password"], PASSWORD_DEFAULT); // 连接数据库 $mysql = require __DIR__ . "/database.php"; // 插入operators表(保留原参数绑定逻辑) $sql = "INSERT INTO operators (first_name, last_name, email, password_hash, company) VALUES (?, ?, ?, ?, ?)"; $stmt = $mysql->stmt_init(); if (!$stmt->prepare($sql)){ die("SQL错误: " . $mysql->error); } $stmt->bind_param("sssss", $_POST["first_name"], $_POST["last_name"], $_POST["email"], $password_hash, $company); if (!$stmt->execute()) { die($mysql->error . " " . $mysql->errno); } // 创建企业表:用反引号包裹表名 $sql = "CREATE TABLE `$company` ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(128) NOT NULL, last_name VARCHAR(128) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, company VARCHAR(128), credit VARCHAR(60), phone VARCHAR(60))"; if (!$mysql->query($sql)) { die("创建表失败: " . $mysql->error); } // 插入企业表:反引号包裹表名,参数绑定处理字段值 $sql = "INSERT INTO `$company` (first_name, last_name, email, company, credit, phone) VALUES (?, ?, ?, ?, ?, ?)"; $stmt = $mysql->stmt_init(); if (!$stmt->prepare($sql)){ die("SQL错误: " . $mysql->error); } $stmt->bind_param("ssssss", $_POST["first_name"], $_POST["last_name"], $_POST["email"], $company, $_POST["credit"], $_POST["phone"]); if ($stmt->execute()) { header("Location: signup_success.php"); exit; }
关键说明
- 保留字处理:所有表名用反引号`包裹,彻底避免保留关键字引发的语法错误。
- 输入过滤:通过正则表达式过滤非法字符,从根源上阻断SQL注入的可能。
- 空值校验:过滤后若企业名为空,直接终止流程,避免创建无效表。
- 参数绑定:字段值的插入依然使用bind_param,确保数据插入环节的安全性。
内容的提问来源于stack exchange,提问作者Reece Grover
相关产品推荐
相关产品推荐

