مدیریت اسپمها در SignalR
نویسنده: علیرضا صبوری
تاریخ: ۱۳۹۴/۰۹/۱۵ ۲۲:۵۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
<HubName("chat")>
Public Class ChatHub
Inherits Hub
Public Sub sendMessage(msg As String)
Clients.All.getMessage(msg) 'Call getMessage function client side
End Sub
End Class Public Class ActivityInfo
Sub New(connectionId As String)
Me.ConnectionID = connectionId
Me.Time = Now
End Sub
Public Property ConnectionID As String
Public Property Time As DateTime
End Class Public Class SpamDetectionPiplelineModule
Inherits HubPipelineModule
Public Property SpamDetection As New HashSet(Of ActivityInfo)
Private _SpamDetectionLock As New Object
Public Function IsSpam(ConnectionId As String) As Boolean
SyncLock _SpamDetectionLock
'Remove all old info before 3 seconds ago
SpamDetection.RemoveWhere(Function(q) q.Time < Now.AddSeconds(-3))
SpamDetection.Add(New ActivityInfo(ConnectionId))
'Check activities from 3 seconds ago
If SpamDetection.Where(Function(q) q.ConnectionID = ConnectionId).Count > 2 Then
Return True
Else
Return False
End If
End SyncLock
End Function
Protected Overrides Function OnBeforeIncoming(context As IHubIncomingInvokerContext) As Boolean
If IsSpam(context.Hub.Context.ConnectionId) Then
Return False
End If
Return MyBase.OnBeforeIncoming(context)
End Function
End Class Public Class Startup
Public Sub Configuration(app As IAppBuilder)
GlobalHost.HubPipeline.AddModule(New SpamDetectionPiplelineModule)
app.MapSignalR
End Sub
End Class var methodName = context.MethodDescriptor.Name;
public class ActivityInfo
{
public ActivityInfo(string connectionId)
{
ConnectionId = connectionId;
Time = DateTime.Now;
}
public string ConnectionId { get; set; }
public DateTime Time { get; set; }
}
public class SpamDetectionPiplelineModule : HubPipelineModule
{
public static HashSet<ActivityInfo> SpamDetection = new HashSet<ActivityInfo>();
private readonly object _spamDetectionLock = new object();
public bool IsSpam(string connectionId)
{
lock (_spamDetectionLock)
{
//Remove all old info before 3 seconds ago
SpamDetection.RemoveWhere(q => q.Time < DateTime.Now.AddSeconds(-3));
SpamDetection.Add(new ActivityInfo(connectionId));
//Check activities from 3 seconds ago
if (SpamDetection.Count(q => q.ConnectionId == connectionId) > 3)
{
return true;
}
return false;
}
}
protected override bool OnBeforeIncoming(IHubIncomingInvokerContext context)
{
if (IsSpam(context.Hub.Context.ConnectionId))
{
return false;
}
return base.OnBeforeIncoming(context);
}
}