mirror of
https://github.com/opensim/opensim.git
synced 2026-08-10 11:33:28 +08:00
* Added a Basic DOS protection container/base object for the most common HTTP Server handlers. XMLRPC Handler, GenericHttpHandler and <Various>StreamHandler
* Applied the XmlRpcBasicDOSProtector.cs to the login service as both an example, and good practice. * Applied the BaseStreamHandlerBasicDOSProtector.cs to the friends service as an example of the DOS Protector on StreamHandlers * Added CircularBuffer, used for CPU and Memory friendly rate monitoring. * DosProtector has 2 states, 1. Just Check for blocked users and check general velocity, 2. Track velocity per user, It only jumps to 2 if it's getting a lot of requests, and state 1 is about as resource friendly as if it wasn't even there.
This commit is contained in:
@@ -42,14 +42,22 @@ using log4net;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||
{
|
||||
public class FriendsRequestHandler : BaseStreamHandler
|
||||
public class FriendsRequestHandler : BaseStreamHandlerBasicDOSProtector
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private FriendsModule m_FriendsModule;
|
||||
|
||||
public FriendsRequestHandler(FriendsModule fmodule)
|
||||
: base("POST", "/friends")
|
||||
: base("POST", "/friends", new BasicDosProtectorOptions()
|
||||
{
|
||||
AllowXForwardedFor = true,
|
||||
ForgetTimeSpan = TimeSpan.FromMinutes(2),
|
||||
MaxRequestsInTimeframe = 5,
|
||||
ReportingName = "FRIENDSDOSPROTECTOR",
|
||||
RequestTimeSpan = TimeSpan.FromSeconds(5),
|
||||
ThrottledAction = ThrottleAction.DoThrottledMethod
|
||||
})
|
||||
{
|
||||
m_FriendsModule = fmodule;
|
||||
}
|
||||
|
||||
@@ -165,7 +165,16 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||
regionimage = regionimage.Replace("-", "");
|
||||
m_log.Info("[WORLD MAP]: JPEG Map location: " + m_scene.RegionInfo.ServerURI + "index.php?method=" + regionimage);
|
||||
|
||||
MainServer.Instance.AddHTTPHandler(regionimage, OnHTTPGetMapImage);
|
||||
MainServer.Instance.AddHTTPHandler(regionimage,
|
||||
new GenericHTTPDOSProtector(OnHTTPGetMapImage, OnHTTPThrottled, new BasicDosProtectorOptions()
|
||||
{
|
||||
AllowXForwardedFor = false,
|
||||
ForgetTimeSpan = TimeSpan.FromMinutes(2),
|
||||
MaxRequestsInTimeframe = 4,
|
||||
ReportingName = "MAPDOSPROTECTOR",
|
||||
RequestTimeSpan = TimeSpan.FromSeconds(10),
|
||||
ThrottledAction = ThrottleAction.DoThrottledMethod
|
||||
}).Process);
|
||||
MainServer.Instance.AddLLSDHandler(
|
||||
"/MAP/MapItems/" + m_scene.RegionInfo.RegionHandle.ToString(), HandleRemoteMapItemRequest);
|
||||
|
||||
@@ -1081,6 +1090,16 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||
block.Y = (ushort)(r.RegionLocY / Constants.RegionSize);
|
||||
}
|
||||
|
||||
public Hashtable OnHTTPThrottled(Hashtable keysvals)
|
||||
{
|
||||
Hashtable reply = new Hashtable();
|
||||
int statuscode = 500;
|
||||
reply["str_response_string"] = "I blocked you! HAHAHAHAHAHAHHAHAH";
|
||||
reply["int_response_code"] = statuscode;
|
||||
reply["content_type"] = "text/plain";
|
||||
return reply;
|
||||
}
|
||||
|
||||
public Hashtable OnHTTPGetMapImage(Hashtable keysvals)
|
||||
{
|
||||
m_log.Debug("[WORLD MAP]: Sending map image jpeg");
|
||||
|
||||
Reference in New Issue
Block a user