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

用Fetch POST发送MySQL DELETE查询是否安全?前端暴露密码存风险

问题:前端明文传递密码触发数据库删除操作,是否安全?

许多虚拟主机(如infinityfree、000webhost)会拦截HTTP DELETE请求,因此我采用了一种方案:在HTTP POST请求体中添加密码,触发PHP向MySQL发送DELETE查询。但该密码在前端代码中可见,任何网站访客都能获取,请问这种方式是否安全?有人能否利用该密码对数据库实施危害,比如SQL注入?

React JS代码

async function sendDeleteRequest(i) {
  const bodyWithPassword = {
    ...props.updatedProducts[i],
    password: "kfI2KiIMOibKn0X98ufe$#!G^z78FNbbvI!fng0p*vk",
  };
  await fetch(Links["products"], {
    method: "POST",
    body: JSON.stringify(bodyWithPassword),
    headers: {
      "Content-Type": "application/json",
    },
  });
  await props.refreshProductListContent();
}

PHP代码

// 如果请求体包含密码,则执行删除查询
if ($json["password"] = "kfI2KiIMOibKn0X98ufe$#!G^z78FNbbvI!fng0p*vk") {
    $deleteProduct = new $json["productType"]($json);
    $deleteProduct->deleteProduct($json);
    return;
}
// 如果请求体没有密码,则添加产品到数据库
$newProduct = new $json["productType"]($json);
$newProduct->addProduct($json, $newProduct);

回答

  • 完全不安全,密码暴露等于无防护:前端代码里的固定密码任何人都能通过查看页面源码、抓包工具获取到,拿到密码后,任何人都能构造POST请求触发删除操作,相当于你的数据库删除接口完全公开,随便谁都能删数据。
  • SQL注入风险取决于deleteProduct的实现:如果deleteProduct方法直接把$json里的参数拼接到SQL语句中(比如DELETE FROM products WHERE id = {$json['id']}),必然会遭遇SQL注入;如果用了PDO或mysqli的预处理语句,注入风险会降低,但密码暴露的核心问题依然存在。
  • PHP代码存在致命逻辑bug:你用了赋值运算符=而非比较运算符==/===,这意味着不管请求里的密码是什么,条件都会成立并直接执行删除操作——这比密码暴露更严重,现在任何POST请求都会触发删除逻辑。

改进建议

  1. 立即修复PHP的比较bug:把if ($json["password"] = "...")改成if ($json["password"] === "..."),先解决这个直接生效的致命问题。
  2. 放弃前端传固定密码的方案:前端不能存储任何敏感凭证,改用后端会话验证——比如用户登录后,后端生成会话(session),只有登录后的合法用户才能调用删除接口,验证会话有效性而非依赖前端传密码。
  3. 强制使用参数化查询:所有数据库操作(添加、删除)都必须用预处理语句,彻底杜绝SQL注入风险。
  4. 若必须用凭证验证:可在后端生成短期有效、带过期时间的token,前端请求删除时携带该token,token需存储在后端会话或数据库中,绝不能把固定密码写死在前端。

内容的提问来源于stack exchange,提问作者Tedis Rozenfelds

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:45:52