RequestInterceptMiddleware.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using Hangfire;
  2. using Masuit.MyBlogs.Core.Common;
  3. using Masuit.MyBlogs.Core.Configs;
  4. using Masuit.MyBlogs.Core.Extensions.Hangfire;
  5. using Masuit.MyBlogs.Core.Models.ViewModel;
  6. using Masuit.Tools;
  7. using Masuit.Tools.Core.Net;
  8. using Microsoft.AspNetCore.Http;
  9. using Microsoft.Net.Http.Headers;
  10. using System;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Text.RegularExpressions;
  14. using System.Threading.Tasks;
  15. using System.Web;
  16. namespace Masuit.MyBlogs.Core.Extensions.Firewall
  17. {
  18. /// <summary>
  19. /// 请求拦截器
  20. /// </summary>
  21. public class RequestInterceptMiddleware
  22. {
  23. private readonly RequestDelegate _next;
  24. /// <summary>
  25. /// 构造函数
  26. /// </summary>
  27. /// <param name="next"></param>
  28. public RequestInterceptMiddleware(RequestDelegate next)
  29. {
  30. _next = next;
  31. }
  32. public async Task Invoke(HttpContext context)
  33. {
  34. var request = context.Request;
  35. //启用读取request
  36. request.EnableBuffering();
  37. if (!AppConfig.EnableIPDirect && request.Host.Host.MatchInetAddress() && !request.Host.Host.IsPrivateIP())
  38. {
  39. context.Response.StatusCode = 404;
  40. return;
  41. }
  42. var ip = context.Connection.RemoteIpAddress.ToString();
  43. var path = HttpUtility.UrlDecode(request.Path + request.QueryString, Encoding.UTF8);
  44. var requestUrl = HttpUtility.UrlDecode(request.Scheme + "://" + request.Host + path);
  45. var match = Regex.Match(path ?? "", CommonHelper.BanRegex);
  46. if (match.Length > 0)
  47. {
  48. BackgroundJob.Enqueue(() => HangfireBackJob.InterceptLog(new IpIntercepter()
  49. {
  50. IP = ip,
  51. RequestUrl = requestUrl,
  52. Time = DateTime.Now,
  53. UserAgent = request.Headers[HeaderNames.UserAgent],
  54. Remark = $"检测到敏感词拦截:{match.Value}"
  55. }));
  56. context.Response.StatusCode = 400;
  57. await context.Response.WriteAsync("参数不合法!", Encoding.UTF8);
  58. return;
  59. }
  60. if (!context.Session.TryGetValue("session", out _) && !context.Request.IsRobot())
  61. {
  62. context.Session.Set("session", 0);
  63. var referer = context.Request.Headers[HeaderNames.Referer].ToString();
  64. if (!string.IsNullOrEmpty(referer))
  65. {
  66. try
  67. {
  68. new Uri(referer);//判断是不是一个合法的referer
  69. if (!referer.Contains(context.Request.Host.Value) && !referer.Contains(new[] { "baidu.com", "google", "sogou", "so.com", "bing.com", "sm.cn" }))
  70. {
  71. HangfireHelper.CreateJob(typeof(IHangfireBackJob), nameof(IHangfireBackJob.UpdateLinkWeight), args: referer);
  72. }
  73. }
  74. catch
  75. {
  76. context.Response.StatusCode = 504;
  77. await context.Response.WriteAsync("您的浏览器不支持访问本站!", Encoding.UTF8);
  78. return;
  79. }
  80. }
  81. }
  82. if (!context.Request.IsRobot())
  83. {
  84. if (request.QueryString.HasValue)
  85. {
  86. var q = request.QueryString.Value.Trim('?');
  87. requestUrl = requestUrl.Replace(q, q.Split('&').Where(s => !s.StartsWith("cid") && !s.StartsWith("uid")).Join("&"));
  88. }
  89. TrackData.RequestLogs.AddOrUpdate(ip, new RequestLog()
  90. {
  91. Count = 1,
  92. RequestUrls = { requestUrl },
  93. UserAgents = { request.Headers[HeaderNames.UserAgent] }
  94. }, (_, i) =>
  95. {
  96. i.UserAgents.Add(request.Headers[HeaderNames.UserAgent]);
  97. i.RequestUrls.Add(requestUrl);
  98. i.Count++;
  99. return i;
  100. });
  101. }
  102. if (string.IsNullOrEmpty(context.Session.Get<string>(SessionKey.TimeZone)))
  103. {
  104. context.Session.Set(SessionKey.TimeZone, context.Connection.RemoteIpAddress.GetClientTimeZone());
  105. }
  106. await _next(context);
  107. }
  108. }
  109. }