Laravel 5.5 现已包含 TrustedProxy

发布时间:作者:

Laravel 5.5 Now Includes TrustedProxy image

Laravel v5.5 刚在 Laracon EU 发布一周。您可能已经注意到 v5.5 的 composer.json 文件需要 fideloper/proxy composer 包。对我来说,这是我必须立即在每个项目中包含的那些包之一,因为我每天都使用 Amazon Web Services 和 Google Cloud,所以我感谢 Laravel 5.5 默认包含此包。

设置此包非常容易,我尤其感谢此包可以解决冗余设置问题。让我们简要介绍一下此包为 Laravel 提供的内容,以及为什么它是 Laravel 生态系统中重要的一个包。

TrustedProxy 包的作用是什么?

从高级的角度来看,Trusted Proxy 会告诉 Laravel 哪些代理可以信任,以及如何映射请求中的 X-Forwarded-* 标头。

包的自述文件可能更好地总结了这一点

设置可信代理允许在 Laravel 中进行正确的 URL 生成、重定向、会话处理和登录,即使是在代理后面。

如果您在负载均衡器、HTTP 缓存或其他中间(反向)代理后面使用您的 Web 服务器,这将非常有用。

Laravel 使用 Symfony 来处理请求和响应。这些类具有处理代理的方法。但是,出于安全原因,在它们尝试读取 X-Forwarded-* 标头之前,必须告知它们哪些代理是“可信的”。

Laravel 没有开箱即用的“信任”代理的简单配置选项。此包只是提供了一个选项。

使用代理

对于开发人员来说,使用像 Amazon Web Services 这样的云提供商和像 Cloudflare 这样的内容交付网络(CDN)来进行全站交付是司空见惯的事,应用程序位于这些服务后面,而不是直接暴露给世界。此外,您的应用程序甚至可能位于代理链后面。

例如,当您的网站或应用程序的 DNS 指向 CloudFlare 时,HTTP 请求将从 CloudFlare 代理到您的应用程序。

例如,您可能会注意到 Laravel 新闻的 HTTP 响应中有一些 CloudFlare 标头

$ curl -I https://news.laravel.net.cn/laravel-5-5
HTTP/1.1 200 OK
Date: Wed, 13 Sep 2017 04:15:50 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Cache-Control: no-cache
Server: cloudflare-nginx
CF-RAY: 39d849a3df7a39e2-PHX

您可以看到几个标头(例如 CF-RAYServer)在 cURL 响应中被发送回来。CloudFlare 将请求代理到实际的应用程序,获取响应,附加几个标头,然后将响应发送回最终用户。

由于 CloudFlare 在最终用户和应用程序之间进行代理,因此所有请求对于应用程序来说看起来都一样。为了让应用程序了解有关原始请求的重要详细信息,代理会发送 X-Forwarded* 标头。

以下是一些代理将发送的常用标头

  • X-Forwarded-For – 定义原始 IP 地址的标准标头 (参考)
  • X-Forwarded-Host – 用于识别客户端在 Host HTTP 标头中请求的原始主机的事实上的标准标头 (参考)
  • X-Forwarded-Proto – 用于识别协议(如 HTTP 或 HTTPS)的事实上的标准标头 (参考)
  • X-Forwarded-Port – 帮助您识别客户端用于连接到负载均衡器的端口 (参考)

并非所有代理都使用事实上的标准标头,但此包可以帮助您映射这些标头,以便底层的 Symfony 请求对象知道如何信任代理并获取正确的值。

HTTPS -> HTTP

如果您在负载均衡器级别终止 TLS/SSL,您的应用程序可能会在内部接收 HTTP 请求,但实际上来自用户的原始请求是 HTTPS。如果您处于这种情况,您的应用程序将从代理接收类似于此的标头(以及其他标头)

X-Forwarded-Proto: https

TrustProxies 中间件通过调用 Symfony 的 HttpFoundation Request::setTrustedProxies() 方法,使 Request 对象自动了解代理标头,因此任何 PHP 生成的 URI 都将知道使用 HTTPS,即使请求是通过 HTTP 发出的。如果没有调用 setTrustedProxies(),Laravel 应用程序将无法了解原始请求以及如何正确处理该请求。

配置

fideloper/proxy 包提供了以下 Laravel 配置,以便您能够调整包以适应各种设置,包括提供映射,如果您的代理使用非标准标头名称。

<?php
 
return [
 
/*
* Set trusted proxy IP addresses.
*
* Both IPv4 and IPv6 addresses are
* supported, along with CIDR notation.
*
* The "*" character is syntactic sugar
* within TrustedProxy to trust any proxy
* that connects directly to your server,
* a requirement when you cannot know the address
* of your proxy (e.g. if using Rackspace balancers).
*
* The "**" character is syntactic sugar within
* TrustedProxy to trust not just any proxy that
* connects directly to your server, but also
* proxies that connect to those proxies, and all
* the way back until you reach the original source
* IP. It will mean that $request->getClientIp()
* always gets the originating client IP, no matter
* how many proxies that client's request has
* subsequently passed through.
*/
'proxies' => [
'192.168.1.10',
],
 
/*
* Or, to trust all proxies that connect
* directly to your server, uncomment this:
*/
# 'proxies' => '*',
 
/*
* Or, to trust ALL proxies, including those that
* are in a chain of forwarding, uncomment this:
*/
# 'proxies' => '**',
 
/*
* Default Header Names
*
* Change these if the proxy does
* not send the default header names.
*
* Note that headers such as X-Forwarded-For
* are transformed to HTTP_X_FORWARDED_FOR format.
*
* The following are Symfony defaults, found in
* \Symfony\Component\HttpFoundation\Request::$trustedHeaders
*
* You may optionally set headers to 'null' here if you'd like
* for them to be considered untrusted instead. Ex:
*
* Illuminate\Http\Request::HEADER_CLIENT_HOST => null,
*
* WARNING: If you're using AWS Elastic Load Balancing or Heroku,
* the FORWARDED and X_FORWARDED_HOST headers should be set to null
* as they are currently unsupported there.
*/
'headers' => [
(defined('Illuminate\Http\Request::HEADER_FORWARDED') ? Illuminate\Http\Request::HEADER_FORWARDED : 'forwarded') => 'FORWARDED',
Illuminate\Http\Request::HEADER_CLIENT_IP => 'X_FORWARDED_FOR',
Illuminate\Http\Request::HEADER_CLIENT_HOST => 'X_FORWARDED_HOST',
Illuminate\Http\Request::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
Illuminate\Http\Request::HEADER_CLIENT_PORT => 'X_FORWARDED_PORT',
]
];

配置允许您定义要信任的 IP 地址,或者您可以信任所有直接代理,使用 *,以及代理链中的任何代理,使用 **。请仔细阅读文档,以及本文的最后一部分,了解如何锁定位于代理后面的应用程序。

您可以通过运行 vendor:publish 来创建 config/trustedproxy.php 配置。

php artisan vendor:publish --provider="Fideloper\Proxy\TrustedProxyServiceProvider"

在 Laravel 5.5 中,运行 vendor:publish 而不带参数将使用交互模式,这使得发布供应商文件变得更加容易。

了解更多

Symfony 有一篇简短的文章 如何在负载均衡器或反向代理后面配置 Symfony,其中包含一些有价值的信息。具体来说,以下安全注意事项在使用代理时至关重要

一些反向代理(如 Amazon 的 Elastic Load Balancers)没有静态 IP 地址,甚至没有可以使用 CIDR 表示法定位的范围。在这种情况下,您需要(非常谨慎地)信任所有代理。

  1. 配置您的 Web 服务器,使其不响应来自除负载均衡器以外的任何客户端的流量。对于 AWS,这可以通过安全组来完成。
  2. 一旦您保证流量只来自您信任的反向代理,请配置 Symfony 以始终信任传入请求。

查看 fideloper/proxy,其中包含一个关于如何设置 TrustProxies 中间件和配置的详细自述文件,其中包含大量关于此主题的信息。

Paul Redmond photo

Laravel 新闻的撰稿人。全栈 Web 开发人员和作家。

归档于
Cube

Laravel 新闻通讯

加入 40,000 多名其他开发人员,永不错过新的提示、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动完成和对本地和生产环境的即时反馈进行调试。

Tinkerwell
No Compromises logo

无妥协

来自 No Compromises 播客的两位经验丰富的开发者 Joel 和 Aaron 现在可以为您的 Laravel 项目提供服务。 ⬧ 固定价格 7500 美元/月。 ⬧ 无冗长的销售流程。 ⬧ 无合同。 ⬧ 100% 退款保证。

无妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,确保您的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

正在运行旧版本的 Laravel?即时自动化的 Laravel 升级和代码现代化,让您的应用程序保持新鲜。

Shift
Bacancy logo

Bacancy

只需每月 2500 美元,即可让经验丰富的 Laravel 开发人员(拥有 4-6 年经验)为您的项目注入活力。获得 160 小时的专业知识和 15 天的无风险试用。立即预约电话!

Bacancy
Lucky Media logo

Lucky Media

立即获得幸运 - Laravel 开发的理想选择,拥有超过十年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar: Laravel 电子商务

Laravel 的电子商务。一个开源软件包,将现代无头电子商务功能的力量带到 Laravel。

Lunar: Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 职位招聘网站

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit: Laravel SaaS 启动工具包

SaaSykit 是一个 Laravel SaaS 启动工具包,它包含运行现代 SaaS 所需的所有功能。支付、精美结账、管理面板、用户仪表盘、身份验证、现成组件、统计、博客、文档等。

SaaSykit: Laravel SaaS 启动工具包
Rector logo

Rector

您无缝 Laravel 升级、降低成本和加速创新的合作伙伴,助力成功企业。

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务性、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解 MongoDB 的灵活、现代数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

在您的 Laravel 应用程序中添加 Swagger UI

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel Prompts 构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包为您的 Laravel 应用程序添加评论

阅读文章