Project中用到的python和sqlite3

因为project的需要,所以要处理大量的字符串分析。python对文本的分析支持相对比较好。所以决定使用。

需求大概是对于dump出来的实验数据,要对不同时间段的数据聚合(其实就是concatenate多个文本文件)。同时提取文件中的关键词,并进行一些关键词的模式匹配。不仅仅是string match,而且要匹配在同一个条目中不相邻的element。

一个数据条目大概是这样的:

03-19-2012,02:01:16,xxx.xxx.xxx.xxx,117.53.122.26,pann.nate.com,/floatbrand_ad.html,?v=1
       Date            Time        Victim IP           Attacker IP       Domain name       File path               Query

我们感兴趣的是前五个元素也就是攻击发生的日期时间,被攻击的IP,攻击者的IP和域名。

我们感兴趣的信息是:

1)攻击随着时间发生的次数

2)有多少个不同的受害者,以及每个受害者被攻击的次数和攻击来自于多少个不同的被攻击者

3)有多少个不同的攻击者,以及每个攻击者攻击了多少次和他们所影响的受害者的数目

4)每个受害者被攻击的模式分析。这个分析需要一个聚类的算法。要素是被攻击的数目,攻击发生的时间间隔。准确的说应该是被攻击的密度。

5)同样的对于攻击者,我们希望based on IP,根据攻击的密度来分析他们的攻击模式的种类,有哪些种。

6)Fast Flux的效应,域名与域名所associate的IP地址,合适更换,如何更换,多久更换。

关于模式,暂时的想法有几种:

1)离散攻击型。攻击不是连续进行而是隔一段时间会有一次,可以观察到每次攻击之间的时间间隔,而且会比较均匀。比如 *    *   *   *     *    *    *   *   *     *

2)间歇攻击型。攻击在一个时间段内连续,然后中断一段时间,然后继续。比如 ****    **   *****   ***

3)持续攻击型。攻击在其生命周以内持续相当长的时间连续攻击,比如*******************

Next topic, python and sqlite3

使用sqlite的出发点在于在dump file里面匹配两个关键字,并找出出现的次数。dump file本身是一个文本文件。所以如果两个关键字是连续出现,就可以用简单的字符串匹配来实现。这也是最快的方式。但是对于某一些keyword而言的话,他们彼此不相邻,而且中间相隔的并不是确定的字符,故而如果还是要使用字符串匹配,只能用regular expression来做。第一次的实验结果我就是用re来作分析,结果四万多条结果run了有六七个小时才run完。而且那只是六天的实验数据,现在的结果大概就三个星期,所以这样的方式不合理,所以就请教朋友,使用database来做。

用database的思路是把一条record分解为五个token,然后检查任意的两个keyword是否出现在同一条record里面。

故而步骤分为这么几步:

1)根据文本文件建一个table。

create table phishlive_data (date text, time text, src text, dst text, domain text);
.separator ',' #文本中不可以包含空白字符,故而用逗号来分割token
.import 20120319_mal_url_truncated phishlive_data
.backup phishlive_data

2)在python里调用sqlite3,筛选符合要求的record。

python里调用sqlite3,需要

import sqlite;

有的网上文章说应该是sqlite3,但是我是先安装python再安装sqlite3,好像这样是python检索不到sqlite3这个.so。但是使用sqlite是可以的,不是特别理解为什么是这样。

sqlite3有很多自带的命令(非标准SQL语句):

.header ON|OFF:设置是否显示数据表格的列名
.indices TABLE:显示表格的所有列名
.mode MODE:设置数据表格的显示模式。默认是list,用.separator命令设置的字符串分隔字符(默认是|)。我们比较习惯的是column格式
.nullvalue STRING:当数据为空时,用STRING来填充。默认是空字符串,也就是什么也不显示。
.tables PATTERN:使用PATTERN模式来显示表格
.width NUM NUM...:设置当以column模式显示时,数据显示的宽度
.output FILENAME|stdout:设置数据输出的形式:文件或屏幕的标准输出。
.read FILENAME:从文件读取SQL语句

其他系统控制命令:
.databases:显示目前已经匹配的数据库名称
.table:显示当前数据库中的所有表
.help:显示shell的帮助信息
.show:显示shell目前的设置参数
.quit 和.exit:退出shell


python中调用sqlite的命令要这样

os.system("sqlite3 phishlive_data.db '.read db_commands'"); #利用shell调用sqlite3并执行前面创建database的命令
conn = sqlite.connect("phishlive_data.db"); #连接database
curr = conn.cursor(); #创建一个cursor
curr.execute(select_command); #执行select语句
results = curr.fetchall(); #取返回的结果到列表中

再转一篇文章,关于比较详细的python调用sqlite3

http://kb.cnblogs.com/a/2315452/





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个基于PythonSQLite3数据库的简单界面设计方案: ```python import sqlite3 import tkinter as tk # 创建数据库连接 conn = sqlite3.connect('cal.db') c = conn.cursor() # 创建计算记录表 c.execute('''CREATE TABLE IF NOT EXISTS cal_records (id INTEGER PRIMARY KEY AUTOINCREMENT, num1 REAL, num2 REAL, op TEXT, result REAL)''') # 定义计算函数 def calculate(): num1 = float(entry1.get()) num2 = float(entry2.get()) op = listbox.get(listbox.curselection()) if op == '+': result = num1 + num2 elif op == '-': result = num1 - num2 elif op == '*': result = num1 * num2 elif op == '/': result = num1 / num2 else: result = 0.0 result_label.config(text=str(result)) # 存储计算结果到数据库 c.execute('INSERT INTO cal_records (num1, num2, op, result) VALUES (?, ?, ?, ?)', (num1, num2, op, result)) conn.commit() # 定义查询函数 def query(): num1 = float(entry1.get()) c.execute('SELECT * FROM cal_records WHERE num1=?', (num1,)) records = c.fetchall() result_str = '' for record in records: result_str += f'num1: {record[1]}, num2: {record[2]}, op: {record[3]}, result: {record[4]}\n' result_label.config(text=result_str) # 创建界面 root = tk.Tk() root.title('Calculator') label1 = tk.Label(root, text='Number 1:') label1.grid(row=0, column=0) entry1 = tk.Entry(root) entry1.grid(row=0, column=1) label2 = tk.Label(root, text='Number 2:') label2.grid(row=1, column=0) entry2 = tk.Entry(root) entry2.grid(row=1, column=1) listbox = tk.Listbox(root) listbox.grid(row=2, column=0, columnspan=2) listbox.insert(0, '+', '-', '*', '/') calculate_btn = tk.Button(root, text='Calculate', command=calculate) calculate_btn.grid(row=3, column=0) query_btn = tk.Button(root, text='Query', command=query) query_btn.grid(row=3, column=1) result_label = tk.Label(root, text='') result_label.grid(row=4, column=0, columnspan=2) root.mainloop() # 关闭数据库连接 c.close() conn.close() ``` 在上述界面,我们使用了Python的Tkinter库来创建GUI界面。界面包含两个文本框用于输入两个数值,一个列表框用于选择运算方法,一个计算按钮和一个查询按钮。在点击计算按钮时,程序会根据用户的输入和选择进行相应的数学运算,并将结果显示在界面上。同时,程序会将计算结果存入SQLite3数据库。在点击查询按钮时,程序会根据用户输入的第一个数值从数据库查询相应的计算结果,并将结果显示在界面上。 需要注意的是,在使用SQLite3数据库时,我们需要首先建立数据库连接,然后再通过cursor对象执行SQL语句进行数据库操作。最后,务必在程序结束时关闭数据库连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值