首页 > 试题广场 >

找出下面程序设计问题. 多个同类型错误只需指明第一处.

[问答题]
    找出下面程序设计问题. 多个同类型错误只需指明第一处.
#include "stdio.h" #include "stdlib.h"
#include "string.h"
//
// 说明:
// checkpwd {username} {password} //
// 程序接收两个参数, 分别是用户名和密码. 然后和本地数据库中的正确值比较, 如果匹配则返回 0,
// 失败则返回-1 //
int main(int argc, char* argv[]) {
    char* username = argv[1];
    char* password = argv[2];
    char* cmd = (char*)malloc(256);
    if (strlen(username) == 0 || strlen(password) == 0) return;
    //
    // mysql 命令行参数说明
    // mysql -h {服务器} -u {用户名} -p{密码} {数据库名称}
    //
    sprintf(cmd, "echo 'SELECT * FROM users WHERE username=%s AND password=%s' | /bin/mysql -h 127.0.0.1 -u root -p123 userdb", password, username);
    if (system(cmd) > 0)
          return 0;
    else
          return -1;
}

主要错误:

argv 数组边界未检查

cmd 未释放, main 返回前要增加 free(cmd);

return 无返回值

sprintf 可造成缓冲区溢出

sprintf 参数 password 和 username 写反了

sprintf 参数 password 和 username 有 sql 注入漏洞

sprintf 参数 password 和 username 有 shell 注入漏洞

cmd 中使用 root 用户连接用户数据库

system 的返回值并不代表 sql 执行结果, 而是程序返回值. 只要没有出错, mysql 的进程返回值都为 0.

同时, 本例 select 查询结果为空集也不会造成 sql 出错.

用户的密码明文会出现在 ps 命令行列表中, 并且明文方式保存在数据库中, 有密码泄漏风险

次要问题

main 函数中的 return, 只能使用 0~255 之间的值, 不推荐用负数 (return -1 相当于 255, return -

2 相当于 254, ...)

username/password 缺少头尾空白串的判断

cmd 的长度固定为 256 可能不够

系统可能没有/bin/mysql

mysql 没有指明连接超时查询超时, 程序有可能挂起

hardcode 数据库用户密码

system 的返回值与 libc 的实现有关

程序参数说明写在注释中未写成 --help 触发打印

如果本程序发生 core dump 或被 kill, 则返回值有可能即不是 0, 也不是-1(255), 而是其它值 

发表于 2016-08-18 13:56:09 回复(4)
free
\'
username 和password互换
return;改为return -1;
==0才是正确
发表于 2017-08-07 16:57:35 回复(0)

主要错误:

argv 数组边界未检查

cmd 未释放, main 返回前要增加 free(cmd);

return 无返回值

sprintf 可造成缓冲区溢出

sprintf 参数 password 和 username 写反了

sprintf 参数 password 和 username 有 sql 注入漏洞

sprintf 参数 password 和 username 有 shell 注入漏洞

cmd 中使用 root 用户连接用户数据库

system 的返回值并不代表 sql 执行结果, 而是程序返回值. 只要没有出错, MySQL 的进程返回值都为 0.

同时, 本例 select 查询结果为空集也不会造成 sql 出错.

用户的密码明文会出现在 ps 命令行列表中, 并且明文方式保存在数据库中, 有密码泄漏风险

次要问题

main 函数中的 return, 只能使用 0~255 之间的值, 不推荐用负数 (return -1 相当于 255, return -

2 相当于 254, ...)

username/password 缺少头尾空白串的判断

cmd 的长度固定为 256 可能不够

系统可能没有/bin/mysql

mysql 没有指明连接超时查询超时, 程序有可能挂起

hardcode 数据库用户密码

system 的返回值与 libc 的实现有关

程序参数说明写在注释中未写成 --help 触发打印

如果本程序发生 core dump 或被 kill, 则返回值有可能即不是 0, 也不是-1(255), 而是其它值

发表于 2017-08-24 23:02:44 回复(0)

主要错误:

argv 数组边界未检查

cmd 未释放, main 返回前要增加 free(cmd);

return 无返回值

sprintf 可造成缓冲区溢出

sprintf 参数 password 和 username 写反了

sprintf 参数 password 和 username 有 sql 注入漏洞

sprintf 参数 password 和 username 有 shell 注入漏洞

cmd 中使用 root 用户连接用户数据库

system 的返回值并不代表 sql 执行结果, 而是程序返回值. 只要没有出错, mysql 的进程返回值都为 0.

同时, 本例 select 查询结果为空集也不会造成 sql 出错.

用户的密码明文会出现在 ps 命令行列表中, 并且明文方式保存在数据库中, 有密码泄漏风险

次要问题

main 函数中的 return, 只能使用 0~255 之间的值, 不推荐用负数 (return -1 相当于 255, return -

2 相当于 254, ...)

username/password 缺少头尾空白串的判断

cmd 的长度固定为 256 可能不够

系统可能没有/bin/mysql

mysql 没有指明连接超时查询超时, 程序有可能挂起

hardcode 数据库用户密码

system 的返回值与 libc 的实现有关

程序参数说明写在注释中未写成 --help 触发打印

如果本程序发生 core dump 或被 kill, 则返回值有可能即不是 0, 也不是-1(255), 而是其它值 

发表于 2016-10-30 16:26:35 回复(0)
第1 行的预定义出错,不能将多个预定义放在同一行
没有做参数合法性检查
最后没有释放动态申请的内存
sql语句拼写出错
发表于 2016-10-21 11:34:32 回复(0)
 

发表于 2016-09-28 11:25:29 回复(0)


发表于 2016-09-09 20:33:28 回复(0)
main函数开头没有判断argc的大小;

第11行没有判断cmd是否分配成功;

第12 行if(strlen(username) == 0 || strlen(password) == 0) return;
应return 0;

system(cmd) 执行成功返回0;执行不成功返回1;

编辑于 2016-08-24 16:15:08 回复(0)