面试题答案
一键面试防止SQL注入攻击的措施
- 使用参数化查询:参数化查询将SQL语句与数据分开,避免将用户输入直接嵌入到SQL语句中。数据库会对参数进行单独处理,从而防止恶意SQL代码的注入。
- 输入验证:对用户输入进行严格的验证,确保输入的数据符合预期的格式和类型。例如,对于数字字段,确保输入的是合法的数字;对于日期字段,确保输入的是合法的日期格式。
- 限制数据库权限:为应用程序使用的数据库账户分配最小的权限,只授予执行必要操作所需的权限。这样即使发生SQL注入攻击,攻击者也无法执行敏感操作,如删除整个数据库。
- 转义特殊字符:在将用户输入插入到SQL语句之前,对特殊字符进行转义处理。例如,在MySQL中,可以使用
mysql_real_escape_string
函数对字符串进行转义。
结合MySQL C API的实际代码实现
- 使用参数化查询:
MYSQL *conn; MYSQL_STMT *stmt; MYSQL_BIND bind[1]; char user_input[100]; int param_value; // 初始化MySQL连接 conn = mysql_init(NULL); if (conn == NULL) { fprintf(stderr, "mysql_init() failed\n"); return 1; } if (mysql_real_connect(conn, "localhost", "user", "password", "database", 0, NULL, 0) == NULL) { fprintf(stderr, "mysql_real_connect() failed\n"); mysql_close(conn); return 1; } // 准备SQL语句 const char *query = "SELECT * FROM your_table WHERE column =?"; stmt = mysql_stmt_init(conn); if (stmt == NULL) { fprintf(stderr, "mysql_stmt_init() failed\n"); mysql_close(conn); return 1; } if (mysql_stmt_prepare(stmt, query, strlen(query))!= 0) { fprintf(stderr, "mysql_stmt_prepare() failed\n"); mysql_stmt_close(stmt); mysql_close(conn); return 1; } // 设置参数值 param_value = atoi(user_input); memset(bind, 0, sizeof(bind)); bind[0].buffer_type = MYSQL_TYPE_LONG; bind[0].buffer = (char *)¶m_value; bind[0].is_null = 0; bind[0].length = 0; // 绑定参数 if (mysql_stmt_bind_param(stmt, bind)!= 0) { fprintf(stderr, "mysql_stmt_bind_param() failed\n"); mysql_stmt_close(stmt); mysql_close(conn); return 1; } // 执行查询 if (mysql_stmt_execute(stmt)!= 0) { fprintf(stderr, "mysql_stmt_execute() failed\n"); mysql_stmt_close(stmt); mysql_close(conn); return 1; } // 处理结果 //... // 清理资源 mysql_stmt_close(stmt); mysql_close(conn);
- 输入验证:
// 验证输入是否为数字 int valid = 1; for (int i = 0; user_input[i]!= '\0'; i++) { if (!isdigit(user_input[i])) { valid = 0; break; } } if (!valid) { fprintf(stderr, "Invalid input. Expected a number.\n"); return 1; }
- 转义特殊字符:
char escaped_input[200]; mysql_real_escape_string(conn, escaped_input, user_input, strlen(user_input));
通过以上措施,可以有效地防止SQL注入攻击,并在基于Linux的C语言数据库网络应用中,结合MySQL C API实现安全的数据库操作。