• 社工数据搜索引擎搭建


    如何设计搭建一个社工库

    从初起设计一个社工库,到现在的Beta,前前后后零零整整花了不下一个月的时间,林林总总记录下来,留给需要之人

    泄露数据库格式不一,长相奇葩,因需将用户名、密码、邮箱、哈希等信息按表分列入库,故整理数据是很耗时间的一步

    整体架构

    选择了Debian x64+Mysql+Mysqlcft+Sphinx+Nginx+PHP

    轻量的sqlite数据库,但查询速度及空间消耗过大,对请求时sqlite处理效率较差

    mangodb,但mangodb在分布计算中有更好的优势而在社工库搭建中优势并不明显

    在mysql和postgresql中,选择历久弥新的mysql

    为方便社工库移植,使用VM建一个虚拟机,所有数据库均在虚拟机中,LNMP环境对外只提供PHP查询接口

    实际测试中,CentOS6.4虚拟机中因断电损失过多数据,并不如预想中稳定,且对CoreSeek版本较老的mmseg中文分词编译会出现各种各样的问题,难以解决。32位的操作系统在sphinx单个索引大小上会有限制,几次折腾后还是迁回了Debian7 X64

    整理数据

    一般使用bash脚本完成。DEMO:

    普通格式:

    #!/bin/bash
    sed '/^[ 	]{0,}$/d' $1 | sed 's/[	 ]/	/g' | sed 's/
    //g' |sed '/^s*$/d' | awk -F"	" '{print "NULL|||"$1"|||"$2"||||||"$1"|||xxxx|||" }' | iconv -c -f gb18030 -t UTF-8 | sort | uniq 
    he

    UCmember格式:

    #!/bin/bash
    sed 's/[
     ]//g' $1 | tr -d '
    ' | sed "s/INSERTINTO\`bbs\_uc\_members\`VALUES(//g" | sed "s/','/	/g" | sed "s/,'/	/g" | sed "s/',/	/g" |sed "s/');/
    /g" | awk -F"	" '{ print "NULL|||"$2"||||||"$3"|||"$9"|||"$4"|||"$7"|||xxxx+xxxx+evil++"}' | sed "/+evil++||||||||||||/d"

    PW_MEMBER格式:

    #!/bin/bash
    sed 's/[
     ]//g' $1 | tr -d '
    ' | sed "s/INSERTINTO\`pw_members\`VALUES('/
    /g" | sed "s/','/	/g" | awk -F"	" '{ print $1"|||"$2"||||||"$3"|||"$5"|||xxxx|||"}' | sed "/+evil++||||||||||||/d"

    文件内格式不同的处理脚本eg:

    #!/bin/bash
    sed 's/
    //g' $1 | sed "s/'/[fenhao]/g" | sed 's/[ 	]{1,}/	/g' | sed 's/----/	/g' | awk -F "	" '{ if ($2~/@163.com/)
    {
    if ($3~/^$/) {print "NULL|||"$1"|||"$2$3"||||||"}
    else {print "NULL|||"$1"|||"$3"||||||"}
    }
    else
    {print "NULL|||"$1"|||"$2"||||||"}
    }' | iconv -c -f gb18030 -t UTF-8 | sort | uniq

    批量按行导入:

    #!/bin/bash
    sed '/^[ 	]{0,}$/d' $1 | sed 's/
    //g' | sed '/^s*$/d' | awk '{print "NULL|||"$0"|||xxxx|||" }'

    对于数据库设计也尤为重要。测试后、按表存储、单表记录数不超过3000W,否则建全文索引时间过长。

    库表设计
    CREATE TABLE `evil_xxxx_1` (
    `id` INT( 10 ) NOT NULL AUTO_INCREMENT,
    `username` VARCHAR( 64 ) ,
    `password` VARCHAR( 64 ) ,
    `passhash` VARCHAR( 64 ) ,
    `email` VARCHAR( 64 )
    );
    
    
    CREATE TABLE `evil_ucmember_1` (
    `id` INT( 10 ) NOT NULL AUTO_INCREMENT,
    `username` VARCHAR( 64 ) ,
    `password` VARCHAR( 64 ) ,
    `passhash` VARCHAR( 64 ) ,
    `salt` VARCHAR( 16 ) ,
    `email` VARCHAR( 64 ) ,
    `ip` VARCHAR( 32 ) ,
    `site` VARCHAR( 64 ) ,
    PRIMARY KEY (id)
    );
    
    
    CREATE TABLE `evil_multinfo_1` (
    `id` INT( 10 ) NOT NULL AUTO_INCREMENT,
    `info` VARCHAR( 1024 ) ,
    `site` VARCHAR( 64 ) ,
    PRIMARY KEY (id)
    );

    分表的一个方案:

    INSERT INTO evil_xx_1(evil_xx_1.id,evil_xx_1.username,evil_xx_1.password,evil_xx_1.passhash) SELECT evil_xx.id,evil_xx.username,evil_xx.password,evil_xx.passhash FROM evil_xx where user.id <= 30000000;
    命令查询
    show table status;//查看数据库状态
    desc table; //查看表结构
    set names 'utf8';//设置编码,数据表统一编码UTF-8
    drop index index_name on table_name; //删除索引
    alter table table_name add primary key(id);//添加主键
    alter table table_name drop PRIMARY KEY;//去掉主键
    truncate table table_name;//清空表中数据
    alter table 表名 rename to 新表名;//重命名表
    alter table table_name change Name Name varchar(16);//重命名列及格式
    alter table table_name add column xxxx varchar(64) after aaaa;//添加列
    alter table 表名 drop column 列名;//删除列
    set @t=0;
    update table_name set id=(@t:=@t+1);//重建ID
    导入数据
    load data infile '/tmp/xxxx.sql' 
    into table `evil_xxxx` 
    fields terminated by '|||'
    lines terminated by '
    ';

    速度相对较快

    关于索引

    中文全文索引主要依赖mysqlctf和sphinx,测试发现,sphinx对于分词索引速度较快,但分词的原因导致诸如搜索humor却搜索不到humorous的情况,而mysqlctf索引速度相对较慢且无进度信息,但索引大小可控,一般全文索引1G数据库信息对应MYI大小为5-9G

    关于Coreseek的编译使用,官方有较多文档

    Sphinx配置文件(全文检索包括分词及最小分词5字母)

    source evil_xxx
    {
      type              = mysql
      sql_host          = localhost
      sql_user          = ooo
      sql_pass          = xxx
      sql_db            = db
      sql_port          = 3306
      sql_query_pre     = SET NAMES utf8
      sql_query         = SELECT id,username,password,passhash,email FROM xxxx
      sql_query_info    = SELECT * FROM xxxx WHERE id=$id
    }
    
    
    index evil_xxx
    {
      source            = evil_xxx
      path              = /usr/local/coreseek/var/data/evil_xxx
      docinfo           = extern
      mlock             = 0
      morphology        = none
      min_word_len      = 1
      html_strip        = 0
      charset_dictpath  = /usr/local/mmseg3/etc/
      charset_type      = zh_cn.utf-8
      ngram_len         = 0
      min_infix_len     = 5
      enable_star       = 1//允许模糊搜索
    }

    检索时调用官方API即可

    关于MYSQLCFT建立索引的方法

    首先是安装插件

    wget http://mysqlcft.googlecode.com/files/mysqlcft-1.0.0-x86_64-bin.tar.gz
    tar zxvf mysqlcft-1.0.0-x86_64-bin.tar.gz
    mkdir -p /usr/local/mysqlcft/lib/mysql/plugin/
    cp mysqlcft.so /usr/local/mysqlcft/lib/mysql/plugin/

    登陆mysql后

    INSTALL PLUGIN mysqlcft SONAME 'mysqlcft.so';
    SHOW PLUGINS;

    安装OK后建立索引

    ALTER IGNORE TABLE 数据库名.表名 ADD FULLTEXT INDEX 全文联合索引名 (字段名1,字段名2) WITH PARSER mysqlcft;

    ALTER IGNORE TABLE db.evil_xxxx ADD FULLTEXT INDEX fullindex(username,password,passhash,email) WITH PARSER mysqlcft;

    在搜索时

    SELECT * FROM evil_xxxx WHERE MATCH(username,password,passhash,email) AGAINST ('searchinfo' IN BOOLEAN MODE);

    重建索引

    REPAIR TABLE 数据库名.表名 QUICK;
    几个Tips
    • 增加来源数据库/网站字段,方便针对查询
    • 同库分隔符格式不同,正则替换
    • 数据库引擎选择myisam(而不是INNODB),可使用alter转换
    • 入库分隔符为避免与密码字符重合,可使用类似==aaaa==等分隔符替换入库
    • 数据库中有的邮箱在前密码在后,有的密码在前,邮箱在后,使用awk多写几行分支语句
    • 配置my.cnf文件使得mysql数据处理效率最大化
    .........................................................我将必须获得世俗的成功...............................................
  • 相关阅读:
    查看linux系统的版本
    单机运行环境搭建之 --CentOS-6.5安装配置Tengine
    nginx启动、重启、关闭
    JAVASE02-Unit010: 多线程基础 、 TCP通信
    俄罗斯方块小游戏
    JAVASE02-Unit09: 多线程基础
    JAVASE02-Unit08: 文本数据IO操作 、 异常处理
    JAVASE02-Unit07: 基本IO操作 、 文本数据IO操作
    JAVASE02-Unit06: 文件操作——File 、 文件操作—— RandomAccessFile
    JAVASE02-Unit05: 集合操作 —— 查找表
  • 原文地址:https://www.cnblogs.com/idmask/p/4707951.html
Copyright © 2020-2023  润新知