its-mieger/trusted-proxies

laravel的trusted proxy中间件的扩展版本

1.0.0 2018-03-26 14:07 UTC

This package is auto-updated.

Last update: 2024-09-15 20:43:11 UTC


README

此库允许在Laravel中轻松灵活地配置可信代理。除了Laravel的默认可信代理中间件外,它还允许配置配置预设,信任当前服务器之前配置的代理数量,并使用自定义代理头名称。

设置可信代理可以在Laravel中正确生成URL、进行重定向、处理会话和记录,当位于代理之后。如果你的Web服务器位于负载均衡器、HTTP缓存或其他中间代理(反向代理)之后,这将非常有用。

在Laravel中使用的底层Symfony请求实现支持基于代理IP信任代理数据。此包配置了要信任哪些代理。

安装

更新composer后,将服务提供者添加到config/app.php文件中的providers数组中

ItsMieger\TrustedProxy\TrustedProxiesServiceProvider::class

之后,你可以将中间件添加到你的路由中

ItsMieger\TrustedProxy\TrustedProxies::class

配置

有几种配置可信代理的方法。以下将进行解释。你可以结合不同的配置方法,以满足你的需求。

特别关注预设,这在你在不同的环境中工作或你的代理栈可能动态变化时非常有用。

可信转发头

代理信息可以通过以下头传递

  • FORWARDED
  • X-FORWARDED-FOR
  • X-FORWARDED-HOST
  • X-FORWARDED-PROTO
  • X-FORWARDED-PORT

然而,并非所有代理都支持所有这些头。因此,你必须配置你的代理使用哪些头,因此可以信任。你可以使用headers选项做到这一点。以下示例演示了使用AWS Elastic load balancer时的适当配置

'headers' => [
	\Illuminate\Http\Request::HEADER_FORWARDED         => false,
	\Illuminate\Http\Request::HEADER_X_FORWARDED_FOR   => true,
	\Illuminate\Http\Request::HEADER_X_FORWARDED_HOST  => false,
	\Illuminate\Http\Request::HEADER_X_FORWARDED_PROTO => true,
	\Illuminate\Http\Request::HEADER_X_FORWARDED_PORT  => true,
],

ForwardedX-Forwarded-Host头不受信任,因为ELB不使用这些头。所有其他都被设置为true(可信)。

自定义头名称

如果你有一个包含代理信息的自定义头,你可以将相应的头设置为自定义头的名称,而不是true

'headers' => [
	/* ... */	
	\Illuminate\Http\Request::HEADER_X_FORWARDED_PROTO => 'X-My-Proto-Header',
],

注意:为了实现自定义头,中间件只是将值复制到原始头中。这是唯一让Symfony解析自定义头的方法。缺点是,请求头不再代表原始状态。

按IP信任代理

如果你知道你的代理的IP,你可以简单地使用proxies选项列出它们

'proxies' => ['192.168.0.11'],
'proxies' => ['192.168.0.11', '10.38.0.0/16', '2001:DB8::21f:5bff:febf:ce22:8a2e'],

信任最后n个代理

如果你不知道你的代理的IP或者它们经常变化,你可以指定你的服务器之前有多少个可信代理

'trustLastProxies' => 2,

这意味着直接代理和它前面的代理都是可信的。

信任指令

Forwarded头允许代理设置自定义指令。例如,这可能是一个可以用来验证给定代理数据的秘密

Forwarded: for=12.34.56.78, for=23.45.67.89;secret=egah2CGj55fSJFs, for=10.1.2.3

示例显示了头中的secret=egah2CGj55fSJFs指令,该指令由10.1.2.3添加。

你可以使用以下方式配置此代理数据,使其可信

'trustDirectives' => [
	'secret' => 'egah2CGj55fSJFs'
],

包含在trustDirectives中定义的值的指令的所有代理数据都是可信的。

配置预设

配置预设允许定义多个可信代理配置,并根据环境变量或头选择适当的配置。

您可以根据以下示例配置一个名为 my-preset 的预设

'presets' => [
	'my-preset' => [
		'trustLastProxies' => 0,
		'proxies'          => [],
		'headers'          => [],
		'trustDirectives'  => [],
	],
	'another-preset' => [ /* ... */ ],
]

如您所见,预设中的配置选项与基础级别配置中使用的选项相同。

按环境选择预设

要基于您的环境选择预设,只需将环境变量 TRUSTED_PROXY_DEFAULT_PRESET 设置为预设名称。根据上面的示例,这将是这样

TRUSTED_PROXY_DEFAULT_PRESET=my-preset

按头信息选择预设

为了更灵活,仅根据您的代理栈选择正确的预设,您可以定义头信息,该头信息指定使用哪个预设。

由于头信息不一定总是可信的,它们必须包含一个秘密而不是预设名称。因此,您必须向您想使用的预设中添加一个 secret-键

'presets' => [
	'my-preset' => [
		'secret'           => 'very-secret-value'
		'trustLastProxies' => 0,
		'proxies'          => [],
		'headers'          => [],
		'trustDirectives'  => [],
	],
	'another-preset' => [ /* ... */ ],
]

然后您定义一个头信息,该头信息确定要使用的预设

'presetSecretHeaders' => ['X-My-Preset-Header'],

现在,头信息必须包含预设的秘密

X-My-Preset-Header: very-secret-value

如果您定义了多个预设头信息,它们将按照配置文件中定义的顺序尝试。找到的第一个预设将被使用。