Laravel 安全中间件

发布于 作者

Laravel Security Middleware image

中间件并不是什么新鲜事物。我们已经 在我们的应用程序中使用它很长时间了,用于各种用途,从身份验证到授权等等。

在本教程中,我将介绍如何利用 Laravel 应用程序中中间件的功能来帮助提高应用程序的安全性。您可以为您的应用程序添加无数个标头,这些标头执行不同的操作。让我们深入了解一些不同的安全标头,看看它们的作用以及我在应用程序中喜欢做什么。

在考虑 Laravel 应用程序中的安全性时,我们要做的第一件事是考虑我们不想公开的标头。通常,您的应用程序默认情况下会显示以下标头:X-Powered-By - 这将显示您的应用程序所使用的技术栈。server/Server - 这将揭示运行您的应用程序的服务器技术。例如,apachenginx 等等。

我们要做的第一件事是删除这些标头。

我在一家名为 Treblle 的公司工作,它类似于您 API 的 Google Analytics。我们即将发布一个 新的 API 安全检查,我已经 开源了我们用于隐藏特定标头的中间件。它看起来像这样

final class RemoveHeaders
{
public function handle(Request $request, Closure $next): Response
{
/**
* @var Response $response
*/
$response = $next($request);
 
/**
* @var string $header
*/
foreach ((array) config('headers.remove') as $header) {
$response->headers->remove(
key: $header,
);
}
 
return $response;
}
}

此中间件会遍历我的配置文件中配置的标头,并确保它们在返回给用户之前从响应中删除。

接下来,我通常会将 Referrer-Policy 标头设置为 no-referrer-when-downgrade,当请求返回到同一来源时 - 但对于任何跨域请求则不执行此操作。我使用另一段中间件来执行此操作

final class SetReferrerPolicy
{
public function handle(Request $request, Closure $next): Response
{
/**
* @var Response $response
*/
$response = $next($request);
 
$response->headers->set(
key: 'Referrer-Policy',
values: config('headers.referrer-policy),
);
 
return $response;
}
}

我把这些操作分成独立的中间件类,以便我可以针对每条路由中对我的安全级别进行具体说明。我希望对某些路由更开放,而我希望对其他路由更保守。

让我们谈谈 Strict-Transport-Security 标头。这将告诉客户端/浏览器使用 HTTPS 连接到我们的应用程序,以及此规则应持续多长时间。此标头有助于保护您的应用程序用户免受中间人攻击。您还可以将 includeSubdomains 添加到此标头,告诉浏览器将此策略应用于所有网站子域。

final class StrictTransportSecurity
{
public function handle(Request $request, \Closure $next): Response
{
/**
* @var Response $response
*/
$response = $next($request);
 
$response->headers->set(
key: 'Strict-Transport-Security',
values: config('headers.strict-transport-security'),
);
 
return $response;
}
}

我喜欢的下一个标头是 Content-Security-Policy 标头,它是使用最广泛的标头之一。我没有为此创建一个自定义中间件,因为 Spatie 有一个 很棒的软件包 可以使用。链接的 Laravel 新闻文章详细介绍了如何设置它,因此我不会详细介绍。所以让我们继续。

您的 SSL 证书可以对您的用户具有不同的透明度级别。这种公共日志记录机制将允许任何人监控证书颁发。这将有助于检测和防止诸如伪造证书之类的事件。它还具有各种配置选项:max-age 将指定浏览器应记住策略的最长时间(以秒为单位)。enforce 将指定您是否希望浏览器强制执行策略。如果我们将其设置为 true,则浏览器将不允许与您的应用程序进行非 SSL 连接。report-uri 将指定浏览器应将有关违反您的应用程序 CT 策略的任何报告发送到的 URL。让我们看看它的中间件,看看我们想做什么

final class CertificateTransparencyPolicy
{
public function handle(Request $request, \Closure $next): Response
{
/**
* @var Response $response
*/
$response = $next($request);
 
$response->headers->set(
key: 'Expect-CT',
values: config('headers.certificate-transparency'),
);
 
return $response;
}
}

如您所见,其中一些中间件类很简单。它们的组合将为您提供针对潜在攻击的最佳保护。

我们要看的最后一个中间件是 Permissions-Policy 标头。我们可以使用此标头来告诉浏览器浏览器允许使用哪些功能和 API。这将有助于保护您免受诸如 XSS 攻击和点击劫持之类事件的影响。

final class PermissionsPolicy
{
public function handle(Request $request, \Closure $next): Response
{
/**
* @var Response $response
*/
$response = $next($request);
 
$response->headers->set(
key: 'Permissions-Policy',
values: config('headers.permissions-policy'),
);
 
return $response;
}
}

使用此中间件,我可以特别关注我要启用的功能,这意味着我可以确保我的最终用户和我的安全。

您可以查看的另一个很棒的软件包是 Laravel 安全标头,由 Rob Fonseca 创建。

您是否使用过其他中间件?或者您是否为列出的中间件中的某一个设置了特定的配置?请在 Twitter 上告诉我们!

Steve McDougall photo

Laravel 新闻 的技术作家,Treblle 的开发者倡导者。API 专家,资深 PHP/Laravel 工程师。 YouTube 直播主.

Cube

Laravel 新闻通讯

加入 40,000 多名其他开发人员,绝不错过新的技巧、教程等等。

Laravel Forge logo

Laravel Forge

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

Laravel Forge
Tinkerwell logo

Tinkerwell

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

Tinkerwell
No Compromises logo

No Compromises

Joel 和 Aaron,两位来自 No Compromises 播客的经验丰富的开发人员,现在可以为您的 Laravel 项目聘用。 ⬧ 固定费率为 7500 美元/月。 ⬧ 没有冗长的销售流程。 ⬧ 没有合同。 ⬧ 100% 退款保证。

No Compromises
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

立即获得 Lucky - 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 应用程序添加评论

阅读文章