its-mieger / trusted-proxies
laravel的trusted proxy中间件的扩展版本
Requires
- php: ^7.1
Requires (Dev)
- mockery/mockery: ~1.0
- orchestra/testbench: ^3.6
- phpunit/phpunit: ^7.0
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,
],
Forwarded和X-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
如果您定义了多个预设头信息,它们将按照配置文件中定义的顺序尝试。找到的第一个预设将被使用。