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

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;
}

关键说明

  1. 保留字处理:所有表名用反引号`包裹,彻底避免保留关键字引发的语法错误。
  2. 输入过滤:通过正则表达式过滤非法字符,从根源上阻断SQL注入的可能。
  3. 空值校验:过滤后若企业名为空,直接终止流程,避免创建无效表。
  4. 参数绑定:字段值的插入依然使用bind_param,确保数据插入环节的安全性。

内容的提问来源于stack exchange,提问作者Reece Grover

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:13:09