Linux 服务如何使用 curl 利用 HTTP Get 请求传入 SQL 语句修改数据库表内容和结构


Linux
本文是博主在部署项目时发现的一个小技巧,项目部署在 Linux 虚拟机上,数据库被设置了写权限,作为开发只能使用程序对数据库做增删改查,但是在开发测试阶段会出现很多问题,权限的问题大大降低了开发效率,所以这个技巧会提高开发效率。


1、项目依赖和代码


首先要部署项目确认是否可以使用 curl

本次项目是使用 SpringBoot 3 项目,使用方法调用 SQL 语句需要以下依赖:

<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- MyBatis-Plus -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
    </dependency>
    <!-- MySQL 驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
 </dependencies>   

核心代码如下:


package cn.com.wind.server.controller;

import cn.com.wind.IMStarter.common.Response;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequestMapping("/system")
public class SystemController {

    private final JdbcTemplate jdbcTemplate;

    public SystemController(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @GetMapping("/operateDataBase")
    public Response<?> operateDataBase(@RequestParam("sql") String sql) {
        Map<String, Object> response = new HashMap<>();
        try {
            int result = jdbcTemplate.update(sql);
            response.put("status", "success");
            response.put("affectedRows", result);
            return Response.success(response);
        } catch (Exception e) {
            response.put("status", "error");
            response.put("message", e.getMessage());
            return Response.fail(400, "SQL 执行出错");
        }
    }
}

2、设置两条 SQL语句

使用数据库表 user_role,在 user_database 下,表格字段有三个 uidnamerole,下面使用来个常见的语句作为解析:

INSERT INTO user_database.user_role (uid, role) VALUES (100100, 0)
UPDATE user_database.user_role SET role=2 WHERE uid=100100

在 Linux 中使用 curl 要注意有些字符会被 Base 解释器解释错误,需要进行转译。

假设访问 IP 地址和端口如下所示:

http://localhost:8086/system/operateDataBase?sql=' ' 

3、SQL 语句改造


第一条 INSERT 语句如下:

curl 'http://localhost:8086/system/operateDataBase?sql=INSERT%20INTO%20user_database.user_role%20(uid, role)%20VALUES%20(110359024,0)'

后半部分如下:

INSERT%20INTO%20user_database.user_role%20(uid,role)%20VALUES%20(110359024,0)

第二条 UPDATE 语句如下:

curl 'http://localhost:8086/system/operateDataBase?sql=UPDATE%20user_database.user_role%20SET%20role=2%20WHERE%20uid=100100'

后半部分如下:

UPDATE%20user_database.user_role%20SET%20role=2%20WHERE%20uid=100100

4、注意事项

首先,语句中的空格要做对应的解析,user_database.user_role 这里面的 . 可以不使用转译字符代替。

  • %20:空格
  • %2E.
  • %27' ,最外层的地方的单引号不需要转译。

另外,在 curl 命令中,URL 中的 括号逗号 不需要特别编码,但为了确保命令在 Bash 中正确解析,建议使用 单引号双引号 将整个 URL 包裹起来。这样可以避免 Bash 对括号和逗号进行特殊处理。

  • 单引号可以防止 Bash 对括号和逗号进行特殊处理。这是最简单和最安全的方法。
  • 双引号也可以防止 Bash 对括号和逗号进行特殊处理,但需要注意 URL 中的特殊字符(如 $)可能会被 Bash 解释。

我个人使用的单引号,可以满足使用要求。

在 INSERT 语句中,有的朋友喜欢在 后面加一个空格,或者 = 后面加一个空格,这个时候也是需要使用 %20 转译。

INSERT%20INTO%20user_database.user_role%20(uid,%20role)%20VALUES%20(110359024,%200)
UPDATE%20user_database.user_role%20SET%20role%20=%202%20WHERE%20uid%20=%20100100

由于操作的数据库权限等级很高,建议使用者现在本地数据库做测试。

通过以上方法,你应该能够成功发送 curl 请求,而不会遇到 Bash 语法错误。


5、扩展修改数据库表结构语句


现阶段数据库表 user_database.user_role 只有 uid 一个主键,要将表中的 role 字段与现有的 uid 字段一起设置为主键,可以使用 ALTER TABLE 语句来修改表结构。

  • 删除现有的主键:如果 uid 已经是主键,首先需要删除现有的主键。
    ALTER TABLE user_database.user_role DROP PRIMARY KEY;
    
  • 添加新的复合主键:将 uidrole 一起设置为复合主键。
    ALTER TABLE user_database.user_role ADD PRIMARY KEY (uid, role);
    
  • 设置 role 不能为空
    ALTER TABLE private_quotation_db.user_role MODIFY role INT NOT NULL;
    

对应的 curl 命令

  • 删除现有的主键

    curl 'http://localhost:8086/system/operateDataBase?sql=ALTER%20TABLE%20user_database.user_role%20DROP%20PRIMARY%20KEY'
    
    ALTER%20TABLE%20user_database.user_role%20DROP%20PRIMARY%20KEY
    
  • 添加新的复合主键

    curl 'http://localhost:8086/system/operateDataBase?sql=ALTER%20TABLE%20user_database.user_role%20ADD%20PRIMARY%20KEY%20(uid,%20role)'
    
    ALTER%20TABLE%20user_database.user_role%20ADD%20PRIMARY%20KEY%20(uid,%20role)
    
  • 设置 role 不能为空

    curl 'http://localhost:8086/system/operateDataBase?sql=ALTER%20TABLE%20user_database.user_role%20MODIFY%20role%20INT%20NOT%20NULL'
    
    ALTER%20TABLE%20user_database.user_role%20MODIFY%20role%20INT%20NOT%20NULL
    

相信大家看完这篇内容之后,应该会使用这个技巧了,具体的语句不会写可以问以下对应的 AI 软件,祝大家开发愉快。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值