⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spo_database.c

📁 著名的入侵检测系统snort的最新版本的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
 * * 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 + -