
集美中学 吴隆
指导教师 张志勇
网络行为记录评测系统—网页监控系统
摘要:针对青少年沉迷网络及访问不良网站现状,本项目通过对其所访问网站标题及网页内容的高频字进行提取,进行份统计分析、实时监控,并将统计结果反馈给家长。本项目在windows操作系统环境下设计并实现,并让家长通过电子邮件方式或手机短信灵活监控了孩子经常登陆的网站,及时加以引导。
关键词:网络行为、评测、高频字、健康上网
第一章 引言
1、研究背景
网络的产生体现出了社会的进步,大大改变了人们交流与沟通的传统方式。目前网络已经是人们进行科学研究、工作学习、日常生活的不可或缺的工具和途径,越来越多的人群通过网络创造出了一个又一个的奇迹,大大地推动了社会的前进的步伐。网络的发展能使人们在短时间内获得大量、及时的有效信息,能节省大量的时间。但同时也给人们的生活带来了很多弊端,尤其是心理尚未完全成熟的青少年。据中国互联网络信息中心(CNNIC)公布的《中国互联网发展状况统计报告》2007年12月网民数已达到2.1亿人。中国网民数增长迅速,2007年一年增加了7300万,年增长率为53.3%。,在新增网民中,18岁以下的网民和30岁以上年龄较大的网民增长较快。原点市场研究公司调查的2007年的一组数据曾引起教育学家和社会学家的关注,在参与调查的3000名大中学生中曾光顾色情网站的占46%,76%的学生网民沉迷于聊天室,只有近三成的同学选择“搜索信息”、“下载软件”,另有35%的人选择玩游戏。
网络行为测评系统可以让人们了解青少年上网的目的及浏览了什么网站,以便作出相应的对策。
2、选题动机
当前在市场上出现了很多的防沉迷产品,但是目前的产品只是做到禁止访问不良网站或控制上网时间,而对于访问的网站进行统计并给与反馈的产品暂时还没有。
在目前的小网迷群体中,有15%的人曾主动访问过不良网站,10%的人曾被动地收到过不良信息,全球75%的家长明确表示,担心不良信息对孩子产生负面影响。针对这种情况,专家提出了以下建议:
(1). 不要将电脑安装在孩子的卧室,最好放在家中的明显位置,如书房。
(2). 适当控制孩子使用电脑的时间和方式。
(3). 经常了解孩子的上网情况,共同讨论网络趣事。
(4). 与孩子共同阅读电子邮件,预先删除含不良内容的邮件。
(5). 在电脑上安装禁止访问不良网址的软件。
(6). 教育孩子不要轻易将个人信息在网上发布。
(7). 提倡与孩子一起上网,至少不要让孩子关上房门单独上网。
于是,作者从第三点入手,经常了解孩子的上网情况,对其进行监控。
3、相关研究
通过上网查询资料,可以在计算机里安装过滤软件(如“网中行”,“过滤王”,“东方卫士”)或“防火墙”,这些软件一般具有可以拦截网上不良内容、孩子的邮件通信对象和网上聊天对象,设定孩子能够访问的站点。
【上述信息据《家庭教育》、《中国教育报》等综合摘编】
但是这些工具还有一些不足之处:
① 只能设定孩子能上的站点,浪费了网络上更多的资源,所谓“为了一棵树而放弃了整个森林”;
② 没有对网页信息的评测功能
③ 不能及时地了解孩子的网上行为,没有反馈的功能
该系统在上述方面进行了改进和发展。
第二章、系统功能及设计概述
1、系统原理
软件部分截图(图一)
图一 软件主界面
2、具体各个模块的实现
(1)随系统启动方法
在进系统的时候运行,首次运行修改注册表:
HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run
使其安装后能随着Windows操作系统的启动而启动。
public void start_with_windows()
{
if (start_with_win1.Checked)
{
start_with_win1.Checked = false;
start_with_win2.Checked = false;
RegistryKey hklm = Registry.LocalMachine;
RegistryKey run = hklm.OpenSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
if (run.GetValue("网络行为记录分析工具")!= null)
{
run.DeleteValue("网络行为记录分析工具");
}
run.Close();
hklm.Close();
}
else
{
RegistryKey hklm = Registry.LocalMachine;
RegistryKey run = hklm.OpenSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
if (run.GetValue("网络行为记录分析工具") == null)
{
start_with_win1.Checked = true;
start_with_win2.Checked = true;
string exeFileName = Application.ExecutablePath;//含可执行文件名
run.SetValue("网络行为记录分析工具", exeFileName);
}
else
{
run.DeleteValue("网络行为记录分析工具");
start_with_win1.Checked = true;
start_with_win2.Checked = true;
string exeFileName = Application.ExecutablePath;//含可执行文件名
run.SetValue("网络行为记录分析工具", exeFileName);
}
run.Close();
hklm.Close();
}
}
(2)进程保护方法
A、进程的主程序隐身
向系统发窗体控制消息,隐藏主程序。
this.Hide();
B、进程保护
使用进程的原子性,增加守护进程 ,使两个进程相互监视,一旦发现对方被杀就立刻重启对方。这样,这两个进程就很难被杀死了。
static void Main(string[] args)
{
while (true)
{
Process[] P1 = Process.GetProcessesByName("cmd.exe");
if (P1.Length == 0)
{
Process P2 = new Process();
P2.StartInfo.FileName = "cmd.exe";
P2.StartInfo.Arguments = "-s";
P2.Start();
}
Thread.Sleep(1000);
}
}
(3)获取本机打开的IE或其它浏览器的网页标题、网址,以追加方式累计成字符串集,具体实现如下:
BHO
BHO(Browser Helper Object,浏览器辅助对象,简称BHO)
BHO是微软推出的作为浏览器对第三方程序员开放交互接口的业界标准,通过简单的代码就可以进入浏览器领域的“交互接口”(INTERACTIVED Interface)。通过这个接口,程序员可以编写代码获取浏览器的行为,比如“后退”、“前进”、“当前页面”等,利用BHO的交互特性,程序员还可以用代码控制浏览器行业,比如修改替换浏览器工具栏,添加自己的程序按钮等(见图1)。这些在系统看来都是没有问题的。BHO原来的目的是为了更好的帮助程序员打造个性化浏览器,以及为程序提供更简洁的交互功能,本程序就是利用BHO的来实现。
。BHO实例运行在浏览器的地址空间内,能对可访问的对象(如窗口、模块等等)执行任何操作,且因为它依附于浏览器的主窗口,所以其生命周期与浏览器实例的生命周期一致。图二演示了BHO的创建过程:
图二 BHO的创建过程
以下是开发过程。首先创建一个C#项目,类型为Class Library。然后将Class1.cs改名为IObjectWithSite.cs,还要给IObjectWithSite添加两个功能:GetSite和SetSite。
Public Interface Iobjectwithsite
{
[Preservesig]
Int Setsite([Marshalas(Unmanagedtype.Iunknown)]Object Site);
[Preservesig]
Int Getsite(Ref Guid Guid, Out Intptr Ppvsite);
}
添加一个cs文件UrlTrack.cs,并且实现IObjectWithSite接口。使用BHO还需要添加两个引用SHDocVw.dll和MSHTML.dll,可以在Windows\\System32目录下找到。图三
图三 SHDocVw.dll MSHTML.dll 的引用
在IObjectWithSite.cs中,还需要为我们的程序指出IE的GUID,使得它可以挂接(attach)到IE上
[
ComVisible(true),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")
]
另外,还需要给BHO程序分配一个GUID,这个可以通过System.Guid.NewGuid()方法得到
[
ComVisible(true),
Guid("e90da13b-117a-4178-8111-0f712da09ff9"),
ClassInterface(ClassInterfaceType.None)
]
在UrlTrack.cs中,我们还需要写两个方法用来DLL注册和移除注册
public static string BHOKEYNAME = @"SOFTWARE\\...\\Browser Helper Objects";
[ComRegisterFunction]
public static void RegisterBHO(Type type)
{
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(BHO_KEY_NAME, true);
if (registryKey == null)
{
registryKey = Registry.LocalMachine.CreateSubKey(BHO_KEY_NAME);
}
string guid = type.GUID.ToString("B");
RegistryKey bhoKey = registryKey.OpenSubKey(guid, true);
if (bhoKey == null)
{
bhoKey = registryKey.CreateSubKey(guid);
}
// NoExplorer: dword = 1 prevents the BHO to be loaded by Explorer.exe
bhoKey.SetValue("NoExplorer", 1);
bhoKey.Close();
registryKey.Close();
}
[ComUnregisterFunction]
public static void UnregisterBHO(Type type)
{
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(BHO_KEY_NAME, true);
string guid = type.GUID.ToString("B");
if (registryKey != null)
registryKey.DeleteSubKey(guid, false);
}
接下来就是实现具体的统计功能了。考虑一下,当输入网址后,我们需要记录下网址以及当前的时间;当在同一浏览窗口中切换网址时,不仅需要记录下网址和当前时间,还要设置前一个浏览记录的结束时间;并且在关闭浏览器时,也要记下结束时间。所以在SetSite中需要挂载NavigateComplete2和OnQuit事件。
private void NavigateComplete2(object pDisp, ref object URL)
{
string url = URL as string;
if (url.IndexOf("about:blank") >= 0)
{
return;
}
if (visitHists.Count > 0)
{
VisitHist currentHist = visitHists[visitHists.Count - 1];
if (currentHist.VisitUrl != url)
{
currentHist.EndTime = System.DateTime.Now;
}
else
{
return;
}
}
VisitHist newHist = new VisitHist();
newHist.StartTime = System.DateTime.Now;
newHist.VisitUrl = url;
visitHists.Add(newHist);
}
private void OnQuit()
{
if (visitHists.Count > 0)
{
VisitHist currentHist = visitHists[visitHists.Count - 1];
currentHist.EndTime = System.DateTime.Now;
}
// 输出统计记录
...
}
开始编译,然后就可以在bin目录下找到项目的dll文件了。在Console中使用regasm /codebase "UrlTrack.dll"注册dll。打开注册表,在HKLM\\SOFTWARE\\...\\Browser Helper Object可以看到多出了一个子项{E90DA13B-117A-4178-8111-0F712DA09FF9}。
需要注意的是,需要将AssemblyInfo.cs文件中的ComVisible属性设为true,否则在注册BHO时会得到这样的信息:
RegAsm : warning RA0000 : No types were registered.
(4)采用算法提取出高频词(参照论文《无词典高频字串快速提取和统计算法研究》)
● 高频字串提取
汉语词与词之间没有明显的分隔标记,所以,要统计高频字串首先需要将连续的字串切分开来。然而,汉语词的数量很大,想要用一部词典,收录所有的词是几乎不可能的。因此,用词典匹配难免就有遗漏。我们希望不用词典,而用文章本身的统计信息,抽取这些字串。在一篇任意文章中,除了一些段落分隔和标点符号成为词的绝对切分外标记,有一些特殊的字,它们的构词能力较弱,构成反映主题的词则更少,我们把它们称为条件切分标记。例如“们”,构成的实词只有“图们江”,构词时最常见的是代词“我们”“他们”“它们”“她们”等,但这些代词基本对主题没有任何贡献;其它的如,“啊”“吧”“的”“很”“吗”“么”“谁”“你”“它”“他”“她”“要”“也”“又”“有”“在”等都可以看为条件切分标记。到高频字串。
实际代码如下:
using System.IO;
using System.Collections;//use hashtable
using System.Text.RegularExpressions;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void cmdStart_Click(object sender, EventArgs e)
{
string Pattern = @"\\,|\\.|\\ |\\n|\\r|\\?|\\;|\\:|\\!|\\(|\\)|\\042|\“|\”|\\-|[\一-\龥]|[0-9]"; //匹配正值表达式 逗号,点号,空格,换行符,回车符,问号,,分号,冒号,感叹号,左括号,又括号,双引号,左双引号,右双引号,中文字符,数字
string textstring = "";
int j;
Hashtable ht = new Hashtable(); //创建一个Hashtable实例
//Hashtable ht = new Hashtable(); //创建一个Hashtable实例
Regex regex = new Regex(Pattern); //创建Regex实类
textBox2.Text = "";
//读取文件
try
{
StreamReader sr = new StreamReader(@textBox1.Text,System.Text.Encoding.GetEncoding("GB2312"));
textstring = sr.ReadToEnd();
sr.Close();
}
catch
{
MessageBox.Show("请把test.txt文件拷贝到C:/");
}
//根据匹配正值表达式分割字符串
string[] words = regex.Split(textstring);
//单词加入哈希表
foreach (string word in words)
{
//textBox2.Text = textBox2.Text + " " + i;
if (word != null && word != "")
{
if (ht.Contains(word))
{
j = Convert.ToInt32(ht[word]) + 1;
//ht.Remove(word);
//ht.Add(word, j);
ht[word]=j;
}
else
{
ht.Add(word, 1);
}
}
}
////对哈希表排序
ArrayList akeys = new ArrayList(ht.Keys);
//按字母顺序进行排序
//akeys.Sort() ;
//按字单词次数进行排序
string[] keyarray = new string[akeys.Count];
int[] valuearray = new int[akeys.Count];
int index=0;
//将key/value分别赋给数祖
foreach (string skey in akeys)
{
keyarray[index] = Convert.ToString(skey);
valuearray[index] = Convert.ToInt32(ht[skey]);
index++;
}
for(int a=0;a for (int b = a+1; b < akeys.Count; b++) { if (valuearray[a]>valuearray[b]) { valuearray[a] ^= valuearray[b]; valuearray[b] ^= valuearray[a]; valuearray[a] ^= valuearray[b]; string tempstr = keyarray[a]; keyarray[a] = keyarray[b]; keyarray[b] = tempstr; } } } //显示 //按字母顺序进行排序显示 //foreach(string skey in akeys) //{ // textBox2.Text = textBox2.Text + skey + "\" + ht[skey] + "\\r\\n"; //} //按字单词次数进行排序显示 for (int a = 0; a < akeys.Count; a++) { textBox2.Text = textBox2.Text + keyarray[a] + "\" + valuearray[a] + "\\r\\n"; } } } } 本模块截图如图四 图四 词频分析统计模块截图 从一般意义上来讲,长度较长的中文字串在意义上有较好的专指性,而长度较短的字串在概念上一般处于上层,即具有较广的范畴。例如,“计算机”,“电子计算机”,“数字电子计算机”,这三个词的概念范畴逐渐缩小,而意义的专指性逐渐加强。由上面的算法可以知道,我们的后处理子算法趋向于得到长一点的字符串,当然,根据实际需要也可以对此稍做修改,得到趋向于短一点的字符串。 (5)事先自定义各个类别的关键字,把得到的高频字串跟其匹配,然后才分类。如果是正常信息,自动发高频词给指定邮箱,如果是不良信息,同时禁止本机上网,自动发高频词给指定邮箱。 分析评价模块 初步构想: 分析评价采用有字典文字匹配算法实现,利用上面高频字提取模块生成的前10位高频词跟现有字典进行匹配(字典可供用户添加或删除),得到相应评价信息竟而判断上网者是否接触有害信息,是否断网,并给指定邮箱发邮件。 源代码见附件。 禁止本机上网可采用以下方法实现: 先找到“网络连接”这个虚拟文件夹,然后找到要控制的本地连接对应的folderitem,然后枚举verb,找到需要的verb后,调用verb的DoIt方法,在winxp sp2 ,C# sp6下测试通过,代码如下: public static void ToggleWirelessConnection() { foreach (Shell32.FolderItemVerb verb in WirelessConnectionFolderItem.Verbs()) { if (verb.Name == "启用(&A)" || verb.Name == "禁用(&B)") { verb.DoIt(); goto endOfForLoop; } } endOfForLoop: System.Threading.Thread.Sleep(1000); } public static void ToggleLocalAreaConnection() { foreach (Shell32.FolderItemVerb verb in LocalAreaConnectionFolderItem.Verbs()) { if (verb.Name == "启用(&A)" || verb.Name == "禁用(&B)") { verb.DoIt(); goto endOfForLoop; } } endOfForLoop: System.Threading.Thread.Sleep(1000); } #endregion #region "Properties" private static Shell32.Folder ControlPanelFolder { get { Shell32.Shell shell = new Shell32.Shell(); return shell.NameSpace(3); } } private static Shell32.Folder NetworkFolder { get { Shell32.Folder retVal = null; foreach (Shell32.FolderItem fi in ControlPanelFolder.Items()) { //WindowsXP及以上需将下面的字符串改为:“网络连接” if (fi.Name == "网络连接") { retVal=(Shell32.Folder)fi.GetFolder; } } if (retVal == null) { throw (new NetworkConnectionsFolderNotFoundException()); } else { return retVal; } } } private static Shell32.FolderItem LocalAreaConnectionFolderItem { get { Shell32.FolderItem retVal = null; Properties.Settings set = Properties.Settings.Default; foreach (Shell32.FolderItem folderItem in NetworkFolder.Items()) { Console.WriteLine(folderItem.Name); if (folderItem.Name ==set.networkname) { retVal = folderItem; goto endOfForLoop; } } endOfForLoop: if (retVal == null) { throw (new LocalAreaConnectionFolderItemNotFoundException()); } else { return retVal; } } } private static Shell32.FolderItem WirelessConnectionFolderItem { get { Shell32.FolderItem retVal = null; Properties.Settings set = Properties.Settings.Default; foreach (Shell32.FolderItem folderItem in NetworkFolder.Items()) { Console.WriteLine(folderItem.Name); if (folderItem.Name == set.networkname) { retVal = folderItem; goto endOfForLoop; } } endOfForLoop: if (retVal == null) { throw (new WirelessConnectionFolderItemNotFoundException()); } else { return retVal; } } } #endregion #region "Custom Exceptions" public class NetworkConnectionsFolderNotFoundException : Exception { public override string Message { get { return "The Network Connections Folder Could Not Be Found!"; } } } public class LocalAreaConnectionFolderItemNotFoundException : Exception { public override string Message { get { return "The Local Area Connection Folder Could Not Be Found!"; } } } public class WirelessConnectionFolderItemNotFoundException : Exception { public override string Message { get { return "The Wireless Connection Folder Could Not Be Found!"; } } } #endregion } } 采用C#自动发邮件具体实现如下: '发送邮件 public class SendMail { /// /// Net 2.0 发送邮件 /// /// 发送邮件服务器 /// 发信人Email /// 发信人Email密码 /// 收信人Email /// 邮件主题 /// 邮件内容 public static void Send(string strSmtpServer, string strFrom, string strFromPass, string strTo, string strSubject, string strBody) { SmtpClient client = new SmtpClient(strSmtpServer); client.UseDefaultCredentials = false; client.Credentials = new System.Net.NetworkCredential(strFrom, strFromPass); client.DeliveryMethod = SmtpDeliveryMethod.Network; Byte[] b = Encoding.Default.GetBytes(strBody); strBody = Encoding.GetEncoding("gb2312").GetString(b).ToString(); MailMessage message = new MailMessage(strFrom, strTo, strSubject, strBody); message.BodyEncoding = Encoding.UTF8; message.IsBodyHtml = true; client.Send(message); 第三章、模拟测试 通过对含有“自杀” “恐怖袭击” “” “色情””功” “周杰伦” “青花瓷” “留学” “超女” “旅游” “自然科学”等词汇的网页进行测试,通过对高频字的提取,出现“周杰伦” “青花瓷” “留学” “超女” “旅游” “自然科学”等作为正常的信息提交给监护人的邮箱,并且给出一些建议。对高频字出现“自杀” “恐怖袭击” “” “色情””功”等,后台发送消息给监护人的邮件,并且断开网络。 第四章、创作思路 当前网络防沉迷系统广泛受到社会关注,尤其是家长对孩子上网缺乏很好的控制,不能了解孩子上网的记录和过程,就不能了解孩子上网在做什么,是在学习、查资料,还是在玩网络游戏或者浏览不健康的网页。如果家长能及时得到这些信息的话,就能更有效的掌握孩子的网络行为,了解他们所关注的方向和兴趣所在。 出于以上想法,作者想设计一个可以即时记录下用户网页浏览时的记录,并通过高频字串提取的方法把所浏览的页面中出现的高频词语摘录下来,再把这些词语拿到事先定义好的词语库中进行比对,以此来对这些访问的网站进行类型定义,即时将这些网站的类型信息通过自动发邮件的方式返回给家长或者老师,如果高频字串涉及到暴力、色情、反动等等的不良网站系统将立即关闭这些网站并列入黑名单,禁止再次访问。 第五章、总结与展望: 本系统通过对其所访问网站标题及网页内容的高频字进行提取,进行份统计分析、实时监控,并将统计结果反馈给家长。本项目在windows操作系统环境下设计并实现,并让家长通过电子邮件方式或手机短信灵活监控了孩子经常登陆的网站,及时加以引导。弥补了目前一些防沉迷系统和过滤软件在信息反馈方面的缺陷。 目前工作还有很多不足,不成熟的地方,接下来的研究中可以扩展的功能: ● 《网络行为评测系统》是一个具有开放性,可扩展性的系统,可以对其高频词库进行不断的丰富以便提高网站类型判断的精确度。同时,改平台还有需要改进的地方。 ● 一方面,现在的系统是在单机上执行的,如果能在网络中安装,可以同时监控一个网段的情况就能省去许多单机安装软件的麻烦。 ● 另一方面,现在的系统还只能监测浏览的网页中的信息,还不能对网络游戏和其他软件进行监测,今后还需要不断改进,如果能实现对所有应用程序和网页的监控,就能更全面的控制网络行为,并给出更加全面的评测。 参考文献 1、《无字典高频字串快速提取和统计算法研究》 韩客松 王永成 陈桂林 中文信息学报 2、《网络行为测量研究》 乔爱萍1, 2 , 宋如顺1, 2 , 沈玲玲1, 2 ( 1. 江苏省信息安全保密技术工程中心, 江苏南京210000; 2. 南京师范大学数学与计算机科学学院) 3、《基于奇异谱方法的网络行为分析》 吴 桦 丁 伟(东南大学计算机科学与工程系) 4、《构建文明健康的网络环境引导学生上网学习》 作者:福建师范大学 杨峰; 5、《对高校开展大学生网络行为规范教育的思考》 张宗浩(重庆科技学经济系) 6、《C#和.net 3.0 第一步》 作者:周礼
