mysql社工_社工数据搜索引擎搭建

本文详细介绍了如何设计和搭建一个社工库,包括选用Debian + MySQL + Sphinx等技术栈,数据整理过程,以及数据库设计和全文索引的建立。文章还分享了实际操作中的技巧和注意事项,如选择MyISAM引擎,使用特定的入库分隔符等。
摘要由CSDN通过智能技术生成

作者:le4f

如何设计搭建一个社工库

从初起设计一个社工库,到现在的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 '/^[ \t]\{0,\}$/d' $1 | sed 's/[\t ]/\t/g' | sed 's/\r//g' |sed '/^\s*$/d' | awk -F"\t" '{print "NULL|||"$1"|||"$2"||||||"$1"|||xxxx|||" }' | iconv -c -f gb18030 -t UTF-8 | sort | uniq

he

UCmember格式:

#!/bin/bash

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

PW_MEMBER格式:

#!/bin/bash

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

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

#!/bin/bash

sed 's/\r//g' $1 | sed "s/'/[fenhao]/g" | sed 's/[ \t]\{1,\}/\t/g' | sed 's/----/\t/g' | awk -F "\t" '{ 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 '/^[ \t]\{0,\}$/d' $1 | sed 's/\r//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.id,evil_xx.username,evil_xx.password,evil_xx.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 '\n';

速度相对较快

关于索引

中文全文索引主要依赖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数据处理效率最大化

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值