perl anyevent socket监控web日志server

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:
上篇已经讲过client端的CODE
这部分code主要用来接收client端发送来的日志,从数据库中读取reglar然后去匹配.
如果出现匹配则判断为XSS攻击.

server端的SOCKET接收用了coro相关的模块.
配置文件仿照前一篇博客读取即可.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#!/usr/bin/perl
use  warnings;
use  strict;
use  AnyEvent;
use  AnyEvent::DBI::MySQL;
use  Config::Tiny;
use  FindBin;
use  utf8;
use  Coro;
use  Coro::Socket;
use  Coro::Handle;
use  lib  "$FindBin::Bin/../module" ;
my  $server_config_file  "$FindBin::Bin/../etc/config.ini" ;
my  $config              = Config::Tiny->new;
my  $server_config       $config -> read ( $server_config_file );
my  $server_log_info     $server_config ->{ 'server_config_info' };
my  $username            $server_log_info ->{ 'username' };
my  $password   $server_log_info ->{ 'password' };
my  $port       $server_log_info ->{ 'server_port' };
my  $host       $server_log_info ->{ 'host' };
my  $database   $server_log_info ->{ 'database' };
my  $server_ip  $server_log_info ->{ 'server_ip' };
$|++;
print  "Start listening Port:$port" "\n" ;
my  $s  = Coro::Socket->new(
LocalAddr  =>  $server_ip ,     # 创建一个侦听socket
LocalPort  =>  $port ,
Listen     => 5,
Proto      =>  'tcp'
) or  die  $@;
my  @coro ;
while  (1) {
my  $fh $peername  ) =  $s -> accept ;
next  unless  $peername ;
&doit ( $fh );
}
sub  doit {
my  $dbh  = AnyEvent::DBI::MySQL-> connect "dbi:mysql:database=$database" ,
"$username" "$password"  );
my  $fh  shift ;
push  @coro , async {
$fh ->autoflush(1);
while  my  $line  $fh -> readline () ) {
log_regex_do(  $line $dbh  )
}
$fh -> close ;
}
}
sub  log_regex_do {
my  $log $dbh $cv  ) =  @_ ;
my  $log_type $url $source $local $date $option $offer $user  ) =
$log  =~
/t:(.*)\|me:(.*)\|so:(.*)\|lo:(.*)\|date:(.*)\|opt:(.*)\|of:(.*)\|u:(.*)$/;
my  $log_class  = type_result(  $log_type $dbh $cv  );
if  defined  bool(  $local $user $dbh  ) ) {
my  ( $log_result ) = log_result(  $url $dbh  );
if  ( $log_result ) {
get_result_db(
$log_type $log_result $url ,    $source $user ,
$date ,      $option ,      $offer $dbh
);
}
}
}
sub  type_result {
my  $method $dbh  ) =  @_ ;
my  $cvs  = AnyEvent->condvar;
my  $type ;
$dbh -> do ( "set names utf8" );
$dbh ->selectall_hashref(
"select * from w3a_log_monitor_type" ,
'id' ,
sub  {
my  ( $ary_ref ) =  @_ ;
for  my  $id  keys  % $ary_ref  ) {
$type  $ary_ref ->{ $id }->{ 'id' }
if  $method  eq  $ary_ref ->{ $id }->{ 'log_type_name' } );
}
$cvs -> send ;
}
);
$cvs -> recv ;
return  $type ;
}
sub  bool {
my  $local $user $dbh  ) =  @_ ;
my  $cv  = AnyEvent->condvar;
my  $count ;
# $dbh->do("set names utf8");
$dbh ->selectcol_arrayref(
"select * from w3a_log_monitor where task_name='$user' and task_url='$local'" ,
sub  {
my  ( $ref_ary ) =  @_ ;
$count  = @ $ref_ary ;
$cv -> send ;
}
);
$cv -> recv ;
return  $count ;
}
sub  get_result_db {
my  (
$type ,           $method_id ,     $method_url ,
$method_source $method_user ,   $method_date ,
$method_option $method_offer $dbh
) =  @_ ;
my  $cv   = AnyEvent->condvar;
my  $sth  $dbh ->prepare( "
insert into w3a_log_monitor_attack (
method_name,
method_url,
attack_source,
attack_user,
attack_date,
attack_option,
attack_offer,
log_type
) values (?,?,?,?,?,?,?,?)
" );
$sth ->bind_param( 1,  $method_id  );
$sth ->bind_param( 2,  $method_url  );
$sth ->bind_param( 3,  $method_source  );
$sth ->bind_param( 4,  $method_user  );
$sth ->bind_param( 5,  $method_date  );
$sth ->bind_param( 6,  $method_option  );
$sth ->bind_param( 7,  $method_offer  );
$sth ->bind_param( 8,  $type  );
$sth ->execute(
sub  {
my  ( $rv ) =  @_ ;
$cv -> send ;
}
);
$cv -> recv ;
}
sub  log_result {
my  $method $dbh  ) =  @_ ;
my  $cv       = AnyEvent->condvar;
my  $sum_dbh  $dbh ;
my  @target_id ;
$dbh -> do ( "set names utf8" );
$dbh ->selectall_hashref(
"select * from w3a_log_method" ,
'id' ,
sub  {
my  ( $ary_ref ) =  @_ ;
for  my  $id  keys  % $ary_ref  ) {
$cv ->begin;
my  $switch  $ary_ref ->{ $id }->{ 'method_switch' };
unless  $switch  == 0 ) {
if  $method  =~ / $ary_ref ->{ $id }->{ 'method_regex' }/i ) {
print  "Match regular is: " ,
$ary_ref ->{ $id }->{ 'method_regex' },  "\n" ;
push  @target_id $ary_ref ->{ $id }->{ 'id' };
}
}
$cv ->end;
}
}
);
$cv -> recv ;
attack_update(  $_ $dbh  for  @target_id ;
return  @target_id ;
}
sub  attack_update {
my  $id $dbh  ) =  @_ ;
my  $cv  = AnyEvent->condvar;
$dbh ->selectcol_arrayref(
"select attack_sum from w3a_log_method where id='$id' " ,
sub  {
my  ( $ref_ary ) =  @_ ;
my  $sum  $ref_ary ->[0] + 1;
$dbh -> do (
"update w3a_log_method set attack_sum='$sum' where id='$id'" );
$cv -> send ;
}
);
$cv -> recv ;
}

 

 










本文转自 mcshell 51CTO博客,原文链接:http://blog.51cto.com/mcshell/1362689,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
存储 监控 固态存储
如何监控和优化 WAL 日志文件的存储空间使用?
如何监控和优化 WAL 日志文件的存储空间使用?
|
1月前
|
网络协议 Windows
Windows Server 2019 Web服务器搭建
Windows Server 2019 Web服务器搭建
|
1月前
|
监控 网络协议 CDN
阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
|
2月前
|
监控 网络协议 数据库连接
Python3 监控端口:使用 socket 库
Python3 监控端口:使用 socket 库
|
2月前
|
监控 网络协议 数据库连接
Python3 监控端口:使用 socket 库
Python3 监控端口:使用 socket 库
|
2月前
|
运维 Kubernetes 监控
Loki+Promtail+Grafana监控K8s日志
综上,Loki+Promtail+Grafana 监控组合对于在 K8s 环境中优化日志管理至关重要,它不仅提供了强大且易于扩展的日志收集与汇总工具,还有可视化这些日志的能力。通过有效地使用这套工具,可以显著地提高对应用的运维监控能力和故障诊断效率。
309 0
|
3月前
|
SQL 数据库 Java
Hibernate 日志记录竟藏着这些秘密?快来一探究竟,解锁调试与监控最佳实践
【8月更文挑战第31天】在软件开发中,日志记录对调试和监控至关重要。使用持久化框架 Hibernate 时,合理配置日志可帮助理解其内部机制并优化性能。首先,需选择合适的日志框架,如 Log4j 或 Logback,并配置日志级别;理解 Hibernate 的多级日志,如 DEBUG 和 ERROR,以适应不同开发阶段需求;利用 Hibernate 统计功能监测数据库交互情况;记录自定义日志以跟踪业务逻辑;定期审查和清理日志避免占用过多磁盘空间。综上,有效日志记录能显著提升 Hibernate 应用的性能和稳定性。
51 0
|
3月前
|
开发者 前端开发 Apache
Apache Wicket Ajax揭秘:轻松几步,让你的Web应用告别“呆板”,焕发新生!
【8月更文挑战第31天】随着互联网技术的发展,Web应用的交互性成为评价网站成功的关键指标。Apache Wicket作为一款卓越的Java Web框架,不仅具备强大的组件化开发能力,还内置了对Ajax技术的支持,使开发者能轻松提升Web应用的交互体验。通过简单的代码示例展示了如何在不刷新页面的情况下异步更新页面元素,极大提升了用户体验。Wicket提供了多种Ajax组件和行为,如AjaxFallbackLink、AjaxButton等,满足不同场景需求,并支持自定义Ajax行为,帮助开发者实现复杂交互效果。合理运用Wicket的Ajax功能,可显著增强网站竞争力。
42 0
|
3月前
|
开发者 前端开发 编解码
Vaadin解锁移动适配新境界:一招制胜,让你的应用征服所有屏幕!
【8月更文挑战第31天】在移动互联网时代,跨平台应用开发备受青睐。作为一款基于Java的Web应用框架,Vaadin凭借其组件化设计和强大的服务器端渲染能力,助力开发者轻松构建多设备适应的Web应用。本文探讨Vaadin与移动设备的适配策略,包括响应式布局、CSS媒体查询、TouchKit插件及服务器端优化,帮助开发者打造美观且实用的移动端体验。通过这些工具和策略的应用,可有效应对屏幕尺寸、分辨率及操作系统的多样性挑战,满足广大移动用户的使用需求。
66 0
|
3月前
|
存储 运维 监控
Entity Framework Core 实现审计日志记录超棒!多种方法助你跟踪数据变化、监控操作,超实用!
【8月更文挑战第31天】在软件开发中,审计日志记录对于跟踪数据变化、监控用户操作及故障排查至关重要。Entity Framework Core (EF Core) 作为强大的对象关系映射框架,提供了多种实现审计日志记录的方法。例如,可以使用 EF Core 的拦截器在数据库操作前后执行自定义逻辑,记录操作类型、时间和执行用户等信息。此外,也可通过在实体类中添加审计属性(如 `CreatedBy`、`CreatedDate` 等),并在保存实体时更新这些属性来记录审计信息。这两种方法都能有效帮助我们追踪数据变更并满足合规性和安全性需求。
81 0
下一篇
无影云桌面