C语言编写 执行mysql脚本,禁止delete操作

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct sqlConfig
{
        char *db_name;//数据库名称
        char *db_sql;//sql语句
} Config;

int main(int argc,char *argv[])
{

        if(argc!=3)
        {
                printf("第一个参数为数据库名,第二个数据库名为sql语句。\n");
                printf("例如:./a.out mysql 'select * from user;'\n");
                return 0;
        }


        char *shell_cmd = "/xxx/xxx/bin/mysql -h127.0.0.1 -Pxxxx -u xxxx -pxxxx -S /xxx/xxxx/mysql.sock";

        //初始化 结构体
        Config config = {*(argv+1),*(argv+2)};


        /*****  判断是否为delete语句  ******/
        char del_char[6] = {100,101,108,101,116,101};//delete 这个单词的ascii 码
        int is_bool = 0;//如果全部 ascii相同赋值为1
        for(int i=0;i<6;i++)
        {
                if(config.db_sql[i]==del_char[i])
                {
                        is_bool=1;
                }else{
                        is_bool=0;
                        break;
                }
        }
        if(is_bool==1)
        {
                printf("%s\n","危险操作!");
                return 0;
        }

        //动态分配字符变量,用来拼接sql语句
        char *return_text = (char *) malloc(strlen(shell_cmd)+strlen(config.db_name)+strlen(config.db_sql)+10);
        sprintf(return_text,"%s%s%s%s%s%s%s",shell_cmd," -D ",config.db_name," -e ","\"",config.db_sql,"\"");
        printf("%s\n",return_text);
        //执行sql语句
        system(return_text);
        //释放动态变量
        free(return_text);
}

运行:gcc test.c -o my_mysql

接着运行delete操作

./my_mysql bilbil “delete from bilbil_user;”

危险操作

运行 其他操作

./my_mysql bilbil “select * from bilbil_user_info;”
+—-+———+———–+———–+———-+————+———–+———————+———————+
| id | user_id | user_icon | user_name | user_uid | user_birth | user_desc | update_time | create_time |
+—-+———+———–+———–+———-+————+———–+———————+———————+
| 17 | 35 | NULL | NULL | NULL | NULL | | 2019-06-06 14:54:45 | 2019-06-06 14:54:45 |
+—-+———+———–+———–+———-+————+———–+———————+———————+