AccessKeyMiddleware.php 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. use Illuminate\Http\Request;
  5. use Illuminate\Support\Facades\Config;
  6. class AccessKeyMiddleware
  7. {
  8. public function handle(Request $request, Closure $next)
  9. {
  10. $clientIp = $request->header('X-Forwarded-For');
  11. if (!$clientIp) {
  12. $clientIp = $request->ip();
  13. }
  14. $accessKeyInHeader = $request->header('accesskey');
  15. $accessKeyInEnv = env('VALID_ACCESS_KEY');
  16. $internalIpRanges = [
  17. '10.0.0.0/8',
  18. '172.16.0.0/12',
  19. '192.168.0.0/16'
  20. ];
  21. $isInternalIp = false;
  22. foreach ($internalIpRanges as $range) {
  23. if (strpos($range, '/')!== false) {
  24. list($subnet, $bits) = explode('/', $range);
  25. $ipLong = ip2long($clientIp);
  26. $subnetLong = ip2long($subnet);
  27. $mask = -1 << (32 - $bits);
  28. if (($ipLong & $mask) === ($subnetLong & $mask)) {
  29. $isInternalIp = true;
  30. break;
  31. }
  32. } elseif ($clientIp === $range) {
  33. $isInternalIp = true;
  34. break;
  35. }
  36. }
  37. if ($accessKeyInHeader == $accessKeyInEnv && !empty($accessKeyInHeader)) {
  38. return $next($request);
  39. } else if($isInternalIp) {
  40. return $next($request);
  41. } else {
  42. return response()->json(['message' => 'Access denied'], 403);
  43. }
  44. }
  45. }