用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请求都会触发删除逻辑。
改进建议
- 立即修复PHP的比较bug:把
if ($json["password"] = "...")改成if ($json["password"] === "..."),先解决这个直接生效的致命问题。 - 放弃前端传固定密码的方案:前端不能存储任何敏感凭证,改用后端会话验证——比如用户登录后,后端生成会话(session),只有登录后的合法用户才能调用删除接口,验证会话有效性而非依赖前端传密码。
- 强制使用参数化查询:所有数据库操作(添加、删除)都必须用预处理语句,彻底杜绝SQL注入风险。
- 若必须用凭证验证:可在后端生成短期有效、带过期时间的token,前端请求删除时携带该token,token需存储在后端会话或数据库中,绝不能把固定密码写死在前端。
内容的提问来源于stack exchange,提问作者Tedis Rozenfelds
相关产品推荐
相关产品推荐

