Laravel 安全中间件
发布于 作者 Steve McDougall
中间件并不是什么新鲜事物。我们已经 在我们的应用程序中使用它很长时间了,用于各种用途,从身份验证到授权等等。
在本教程中,我将介绍如何利用 Laravel 应用程序中中间件的功能来帮助提高应用程序的安全性。您可以为您的应用程序添加无数个标头,这些标头执行不同的操作。让我们深入了解一些不同的安全标头,看看它们的作用以及我在应用程序中喜欢做什么。
在考虑 Laravel 应用程序中的安全性时,我们要做的第一件事是考虑我们不想公开的标头。通常,您的应用程序默认情况下会显示以下标头:X-Powered-By
- 这将显示您的应用程序所使用的技术栈。server
/Server
- 这将揭示运行您的应用程序的服务器技术。例如,apache
或 nginx
等等。
我们要做的第一件事是删除这些标头。
我在一家名为 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 上告诉我们!