📄 spo_database.c
字号:
* * Arguments: args => argument list * * Returns: Pointer to database structure * ******************************************************************************/DatabaseData *InitDatabaseData(char *args){ DatabaseData *data; data = (DatabaseData *)SnortAlloc(sizeof(DatabaseData)); data->shared = (SharedDatabaseData *)SnortAlloc(sizeof(SharedDatabaseData)); if(args == NULL) { ErrorMessage("database: you must supply arguments for database plugin\n"); DatabasePrintUsage(); FatalError(""); } data->args = SnortStrdup(args); return data;}/******************************************************************************* * Function: ParseDatabaseArgs(char *) * * Purpose: Process the preprocessor arguements from the rules file and * initialize the preprocessor's data struct. * * Arguments: args => argument list * * Returns: void function * ******************************************************************************///DatabaseData *ParseDatabaseArgs(char *args)void ParseDatabaseArgs(DatabaseData *data){ char *dbarg; char *a1; char *type; char *facility; if(data->args == NULL) { ErrorMessage("database: you must supply arguments for database plugin\n"); DatabasePrintUsage(); FatalError(""); } data->shared->dbtype_id = DB_UNDEFINED; data->sensor_name = NULL; data->facility = NULL; data->encoding = ENCODING_HEX; data->detail = DETAIL_FULL; data->ignore_bpf = 0; facility = strtok(data->args, ", "); if(facility != NULL) { if((!strncasecmp(facility,"log",3)) || (!strncasecmp(facility,"alert",5))) data->facility = facility; else { ErrorMessage("database: The first argument needs to be the logging facility\n"); DatabasePrintUsage(); FatalError(""); } } else { ErrorMessage("database: Invalid format for first argment\n"); DatabasePrintUsage(); FatalError(""); } type = strtok(NULL, ", "); if(type == NULL) { ErrorMessage("database: you must enter the database type in configuration file as the second argument\n"); DatabasePrintUsage(); FatalError(""); } /* print out and test the capability of this plugin */ if( !pv.quiet_flag ) printf("database: compiled support for ( ");#ifdef ENABLE_MYSQL if( !pv.quiet_flag ) printf("%s ",KEYWORD_MYSQL); if(!strncasecmp(type,KEYWORD_MYSQL,strlen(KEYWORD_MYSQL))) data->shared->dbtype_id = DB_MYSQL; #endif#ifdef ENABLE_POSTGRESQL if( !pv.quiet_flag ) printf("%s ",KEYWORD_POSTGRESQL); if(!strncasecmp(type,KEYWORD_POSTGRESQL,strlen(KEYWORD_POSTGRESQL))) data->shared->dbtype_id = DB_POSTGRESQL; #endif#ifdef ENABLE_ODBC if( !pv.quiet_flag ) printf("%s ",KEYWORD_ODBC); if(!strncasecmp(type,KEYWORD_ODBC,strlen(KEYWORD_ODBC))) data->shared->dbtype_id = DB_ODBC; #endif#ifdef ENABLE_ORACLE if( !pv.quiet_flag ) printf("%s ",KEYWORD_ORACLE); if(!strncasecmp(type,KEYWORD_ORACLE,strlen(KEYWORD_ORACLE))) data->shared->dbtype_id = DB_ORACLE; #endif#ifdef ENABLE_MSSQL if( !pv.quiet_flag ) printf("%s ",KEYWORD_MSSQL); if(!strncasecmp(type,KEYWORD_MSSQL,strlen(KEYWORD_MSSQL))) data->shared->dbtype_id = DB_MSSQL; #endif if( !pv.quiet_flag ) printf(")\n"); if( !pv.quiet_flag ) printf("database: configured to use %s\n", type); if(data->shared->dbtype_id == 0) { if ( !strncasecmp(type, KEYWORD_MYSQL, strlen(KEYWORD_MYSQL)) || !strncasecmp(type, KEYWORD_POSTGRESQL, strlen(KEYWORD_POSTGRESQL)) || !strncasecmp(type, KEYWORD_ODBC, strlen(KEYWORD_ODBC)) || !strncasecmp(type, KEYWORD_MSSQL, strlen(KEYWORD_MSSQL)) || !strncasecmp(type, KEYWORD_ORACLE, strlen(KEYWORD_ORACLE)) ) { ErrorMessage("database: '%s' support is not compiled into this build of snort\n\n", type); FatalError("If this build of snort was obtained as a binary distribution (e.g., rpm,\n" "or Windows), then check for alternate builds that contains the necessary\n" "'%s' support.\n\n" "If this build of snort was compiled by you, then re-run the\n" "the ./configure script using the '--with-%s' switch.\n" "For non-standard installations of a database, the '--with-%s=DIR'\n" "syntax may need to be used to specify the base directory of the DB install.\n\n" "See the database documentation for cursory details (doc/README.database).\n" "and the URL to the most recent database plugin documentation.\n", type, type, type); } else { FatalError("database: '%s' is an unknown database type. The supported\n" " databases include: MySQL (mysql), PostgreSQL (postgresql),\n" " ODBC (odbc), Oracle (oracle), and Microsoft SQL Server (mssql)\n", type); } } dbarg = strtok(NULL, " ="); while(dbarg != NULL) { a1 = NULL; a1 = strtok(NULL, ", "); if(!strncasecmp(dbarg,KEYWORD_HOST,strlen(KEYWORD_HOST))) { data->shared->host = a1; if( !pv.quiet_flag ) printf("database: host = %s\n", data->shared->host); } if(!strncasecmp(dbarg,KEYWORD_PORT,strlen(KEYWORD_PORT))) { data->port = a1; if( !pv.quiet_flag ) printf("database: port = %s\n", data->port); } if(!strncasecmp(dbarg,KEYWORD_USER,strlen(KEYWORD_USER))) { data->user = a1; if( !pv.quiet_flag ) printf("database: user = %s\n", data->user); } if(!strncasecmp(dbarg,KEYWORD_PASSWORD,strlen(KEYWORD_PASSWORD))) { if( !pv.quiet_flag ) printf("database: password is set\n"); data->password = a1; } if(!strncasecmp(dbarg,KEYWORD_DBNAME,strlen(KEYWORD_DBNAME))) { data->shared->dbname = a1; if( !pv.quiet_flag ) printf("database: database name = %s\n", data->shared->dbname); } if(!strncasecmp(dbarg,KEYWORD_SENSORNAME,strlen(KEYWORD_SENSORNAME))) { data->sensor_name = a1; if( !pv.quiet_flag ) printf("database: sensor name = %s\n", data->sensor_name); } if(!strncasecmp(dbarg,KEYWORD_ENCODING,strlen(KEYWORD_ENCODING))) { if(!strncasecmp(a1, KEYWORD_ENCODING_HEX, strlen(KEYWORD_ENCODING_HEX))) { data->encoding = ENCODING_HEX; } else if(!strncasecmp(a1, KEYWORD_ENCODING_BASE64, strlen(KEYWORD_ENCODING_BASE64))) { data->encoding = ENCODING_BASE64; } else if(!strncasecmp(a1, KEYWORD_ENCODING_ASCII, strlen(KEYWORD_ENCODING_ASCII))) { data->encoding = ENCODING_ASCII; } else { FatalError("database: unknown (%s)", a1); } if( !pv.quiet_flag ) printf("database: data encoding = %s\n", a1); } if(!strncasecmp(dbarg,KEYWORD_DETAIL,strlen(KEYWORD_DETAIL))) { if(!strncasecmp(a1, KEYWORD_DETAIL_FULL, strlen(KEYWORD_DETAIL_FULL))) { data->detail = DETAIL_FULL; } else if(!strncasecmp(a1, KEYWORD_DETAIL_FAST, strlen(KEYWORD_DETAIL_FAST))) { data->detail = DETAIL_FAST; } else { FatalError("database: unknown detail level (%s)", a1); } if( !pv.quiet_flag ) printf("database: detail level = %s\n", a1); } if(!strncasecmp(dbarg,KEYWORD_IGNOREBPF,strlen(KEYWORD_IGNOREBPF))) { if(!strncasecmp(a1, KEYWORD_IGNOREBPF_NO, strlen(KEYWORD_IGNOREBPF_NO)) || !strncasecmp(a1, KEYWORD_IGNOREBPF_ZERO, strlen(KEYWORD_IGNOREBPF_ZERO))) { data->ignore_bpf = 0; } else if(!strncasecmp(a1, KEYWORD_IGNOREBPF_YES, strlen(KEYWORD_IGNOREBPF_YES)) || !strncasecmp(a1, KEYWORD_IGNOREBPF_ONE, strlen(KEYWORD_IGNOREBPF_ONE))) { data->ignore_bpf = 1; } else { FatalError("database: unknown ignore_bpf argument (%s)", a1); } if( !pv.quiet_flag ) printf("database: ignore_bpf = %s\n", a1); } dbarg = strtok(NULL, "="); } if(data->shared->dbname == NULL) { ErrorMessage("database: must enter database name in configuration file\n\n"); DatabasePrintUsage(); FatalError(""); } return;}void FreeQueryNode(SQLQuery * node){ if(node) { FreeQueryNode(node->next); node->next = NULL; free(node->val); node->val = NULL; free(node); }}SQLQuery * NewQueryNode(SQLQuery * parent, int query_size){ SQLQuery * rval; if(query_size == 0) { query_size = MAX_QUERY_LENGTH; } if(parent) { while(parent->next) { parent = parent->next; } parent->next = (SQLQuery *)SnortAlloc(sizeof(SQLQuery)); rval = parent->next; } else { rval = (SQLQuery *)SnortAlloc(sizeof(SQLQuery)); } rval->val = (char *)SnortAlloc(query_size); rval->next = NULL; return rval;} /******************************************************************************* * Function: Database(Packet *, char * msg, void *arg) * * Purpose: Insert data into the database * * Arguments: p => pointer to the current packet data struct * msg => pointer to the signature message * * Returns: void function * ******************************************************************************/void Database(Packet *p, char *msg, void *arg, Event *event){ DatabaseData *data = (DatabaseData *)arg; SQLQuery *query = NULL, *root = NULL; char *timestamp_string = NULL, *insert_fields = NULL, *insert_values = NULL, *sig_name = NULL, *sig_class = NULL, *ref_system_name = NULL, *ref_node_id_string = NULL, *ref_tag = NULL, *packet_data = NULL, *packet_data_not_escaped = NULL, *select0 = NULL, *select1 = NULL, *insert0 = NULL; int i, insert_fields_len, insert_values_len, ok_transaction, ref_system_id, ret; unsigned int sig_id, ref_id, class_id = 0; ClassType *class_ptr; ReferenceNode *refNode; char sig_rev[16]=""; char sig_sid[16]=""; char sig_gid[16]=""; query = NewQueryNode(NULL, 0); root = query;#ifdef ENABLE_DB_TRANSACTIONS BeginTransaction(data);#endif if(msg == NULL) { msg = ""; } /*** Build the query for the Event Table ***/ /* Generate a default-formatted timestamp now */ if(p != NULL) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -