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

Express对接PostgreSQL调用函数报'admin'列不存在问题求助

错误原因
  • SQL拼接语法错误:你直接通过模板字符串拼接用户传入的用户名、密码参数构造SQL语句,当传入用户名为admin时,最终执行的SQL为SELECT checkUsername(admin, 密码值);。PostgreSQL中没有被单引号包裹的字符串会被识别为列名/表名等标识符,不会被当做字符串常量处理,因此会抛出"admin"列不存在的错误。
  • 存在SQL注入风险:直接拼接用户输入构造SQL的写法没有做任何转义处理,攻击者可以构造特殊输入篡改SQL逻辑,导致数据泄露、数据损坏等安全问题。
  • 潜在逻辑缺陷:当前接口使用GET方法定义,但HTTP规范中GET请求通常不携带请求体,部分客户端、代理服务会直接丢弃GET请求的body,可能导致Express的request.body无法正常获取参数。
解决方案
  1. 使用PostgreSQL参数化查询代替手动拼接SQL:pg库支持$n格式的占位符,参数通过数组单独传入,会自动处理类型转义、引号包裹逻辑,同时彻底避免SQL注入风险。
  2. 将接口请求方法改为POST:符合携带请求体的接口设计规范,避免参数丢失问题。
  3. 补充连接释放逻辑与返回值格式化:查询出错时也要释放数据库连接,避免连接泄漏,同时按照需求返回布尔值与结果提示。

修改后的接口代码如下:

router.post("/", (request, response) => {
  const { name, password } = request.body;
  // 前置参数校验
  if (!name || !password) {
    return response.status(400).json({
      success: false,
      message: "用户名和密码不能为空"
    });
  }

  dbpool.connect()
    .then(client => {
      // 参数化查询,$1对应用户名,$2对应密码
      client.query(`SELECT checkUsername($1, $2) as is_valid;`, [name, password])
        .then(res => {
          client.release();
          const isValid = res.rows[0].is_valid;
          response.json({
            success: isValid,
            message: isValid ? "校验通过" : "用户名或密码错误"
          });
        })
        .catch(err => {
          client.release(); // 出错必须释放连接
          console.error("查询错误:", err);
          response.status(500).json({
            success: false,
            message: "服务器内部错误"
          });
        });
    })
    .catch(err => {
      console.error("数据库连接错误:", err);
      response.status(500).json({
        success: false,
        message: "数据库连接失败"
      });
    });
});

调用说明

Postman调用时将请求方法调整为POST,请求头添加Content-Type: application/json,请求体按JSON格式填写用户名和密码即可正常调用。

内容的提问来源于stack exchange,提问作者salif shaikh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:06:02