您的位置:首页 > 其它

留言板 用字典检测非法内容并且禁止IP 带详细介绍

2008-11-19 10:23 344 查看
一.注意事项:

1.本人原创于http://blog.csdn.net/textonly/,转载请注明出处

2.本人系初学者,本代码优化方面可能不够

二.功能简介:

1.用外接字典,对用户提交的内容进行检测,发现违禁内容则提示,连续同个IP提交3次违禁内容则对该IP禁言,禁言一天,当下一个用户提交的时候,系统会检测数据库里一天前的违禁内容并予以删除。

2.可用于留言板,评论等等游客提交等多处地方,并且可发展违禁IP后台管理等等扩展功能。

3.本代码带详细介绍,方便初学者,如有疑问,请留言

4.采用正则表达式来过滤查找内容,别忘记 using System.Text.RegularExpressions; 了。。。

三.系统环境:

ASP.NET C#

SQL 2005

四.数据库设计:

表名 banuser

键值

banid int

bantime datetime

bancontent varchar

banip varchar

bancount int

五.代码部分:

private void ImageButton1_Click(object sender, System.Web.UI.ImageClickEventArgs e) //按钮提交事件

{

SqlConnection ACconn=db.createconnection();

ACconn.Open(); //打开数据库链接

string ip =System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; //获取用户当前IP

string addtime=System.DateTime.Now.ToString();

///

///释放昨日的数据

///

SqlCommand del = ACconn.CreateCommand();

del.CommandText = "delete from banuser where datediff(d,bantime,GetDate())>1 and bancount<8";

del.ExecuteNonQuery();

///

///验证码核对

///

string strValidate = Jhtyj.Common.StringHelper.StringFormat.InputText(tbxValidate.Text,4);

if((string)Session["VNum"] != strValidate.ToUpper())

{

rfvValidate.ErrorMessage = "验证码错误";

rfvValidate.IsValid = false;

return;

}

///

/// 关键词过滤

///

FileStream fs = new FileStream(Server.MapPath(".")+"//zangs.txt",FileMode.Open,FileAccess.Read); //读取文件

StreamReader sr = new StreamReader(fs,System.Text.Encoding.GetEncoding("GB2312"));

string[] words= sr.ReadToEnd().Split('|'); //排除分隔符

bool find = false;

string sPattern = this.content.Text;//content代表提交的内容

foreach (string s in words)//对于每一个违禁内容关键字进行循环

{

if (System.Text.RegularExpressions.Regex.IsMatch(sPattern,s))//检测内容/忽略大小写

{

find = true;//找到了

break;

}

else

{

find = false;//没有找到

}

}

if (!find) //发现非法内容

{

///

///提交次数判定

///

SqlCommand cmd = ACconn.CreateCommand();

cmd.CommandText = "select count(*) from banuser where banip ='"+ip+"'";

int ips = Convert.ToInt32(cmd.ExecuteScalar());

if (ips > 0) //检查是否有存在IP

{

SqlCommand cmd1 = ACconn.CreateCommand();

cmd1.CommandText = "Select bancount from banuser where banip ='"+ip+"'";

int bancount = (int)cmd1.ExecuteScalar();

if (bancount > 2)//核对已经违规次数

{

Response.Write("<script>alert('您因为多次提交非法内容而被禁言中');</script>");

rfvValidate.IsValid = false;

return;

}

}

else

{

Response.Write ("");

}

}

else //没有发现非法内容

{

Response.Write("<script>alert('您所提交的内容中含有非法内容,请慎重');</script>");

try

{

///

///提交次数判定

///

SqlCommand cmd = ACconn.CreateCommand();

cmd.CommandText = "select count(*) from banuser where banip ='"+ip+"'";

int ips = Convert.ToInt32(cmd.ExecuteScalar());

if (ips > 0) //检查是否有存在IP

{

SqlCommand cmd1 = ACconn.CreateCommand();

cmd1.CommandText = "Select bancount from banuser where banip ='"+ip+"'";

int bancount = (int)cmd1.ExecuteScalar();

if (bancount > 2)//核对已经违规次数

{

Response.Write("<script>alert('您因为多次提交非法内容而被禁言中');</script>");

rfvValidate.IsValid = false;

return;

}

else //没有超过次数自动计数

{

string banusersql="update banuser set bancount=bancount+1 where banip ='"+ip+"'"; //计数器+1

SqlCommand ACc=new SqlCommand(banusersql,ACconn);

ACc.ExecuteNonQuery();

rfvValidate.IsValid = false;

return;

}

}

else //IP不存在的时候新加入违规IP

{

string sqll3="insert into banuser(bantime,bancontent,banip,bancount) values ('"+addtime+"','"+this.content.Text.ToString().Replace("/r/n","<br>")+"','"+ip+"','"+1+"')";

SqlCommand sql3=new SqlCommand(sqll3,ACconn);

sql3.ExecuteNonQuery();

rfvValidate.IsValid = false;

return;

}

}

catch(Exception ex)

{

Response.Write(ex.ToString());

}

finally

{

ACconn.Close();

}

}

fs.Close();

sr.Close();

ACconn.Close();

if(this.IsValid)

{

//全部确认无误后进行下一步,例如插入留言数据等等

}

六.字典部分:

字典文件名为 zangs.txt 可以随便改,代码里有

字典结构为 哈哈|哈哈1|哈哈2

需要字典的请留下邮箱,该字典包含敏感词,脏话等等,收集加工于网上来源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: