【转载】Laravel 安全最佳实践:如何构建安全的 PHP 应用

转自:https://learnku.com/laravel/t/62258

如今,进入一个无保护的平台并非什么大事,至少对黑客来讲是这样的。我第一次有这样的感觉是之前我在编程学校的时候,我的一个客户联系我说这个网站有问题。确实,他的网站突然变得需要很长时间加载页面。当我回到我的电脑上解决这个问题,我发现黑客使用 SQL 注入将 <script> 标签输入到代码中。当用户打开网页,就会被跳转到另一个钓鱼网站。

这是我第一次知道这样的问题会突然出现,而且无论网站的大小,它都可能是黑客的目标。那是大约十年前的事了。在那之后,开发任何项目之前,我都会把 web 安全放在第一优先级。确实,绝对的安全是一个梦想,因为一个又一个的高级黑客总是在寻找下一个目标。但是你总可以做一些事情来为你的网站建立防线。

OWASP 和 Laravel

OWASP – 开放式 Web 应用程序安全工程。这是一个非营利性组织,帮助个人和商业组织了解 web 应用程序安全的重要性。他们推出了一个标准指南,解释了网站安全性的 10 大关键点。

Laravel 是目前 PHP 最好的框架之一。我多年内已经用 Laravel 做了很多大大小小的商业项目。这些项目大多都高度敏感,需要广泛的数据和网站安全配置。多亏了 Laravel,开发人员可以很方便地使用所有的安全功能。以下是可以帮助 Laravel 加强在 PHP 项目上的安全性的几大 OWASP 安全措施。

1. 失效的认证

失效的认证是现今常见的一种攻击,不过,您可以利用一些策略来对付它。

  • 在所有易被攻击的端点上使用验证码总是一个好主意。组合在一起的区域是:忘记密码表单、注册和登录表单。 验证码对于阻止自动生成的网络攻击很有用。如果你没有时间开发自己的验证码,你可以使用 Google 的 reCaptcha
  • 如果你的登录尝试没有限制,那么考虑限制它。它提供了一个非常可观的保护层。要限制请求,请使用 Laravel 的中间件
  • 多层身份验证可以为你的网站增加了一个几乎无法逾越的安全级别。这些可以是 OTP、双重认证、二维码、电子邮件,甚至是短信。
  • 要保护会话的安全,请务必使用 HTTPS 发送会话。另外,在 session.php 文件中启用 secure 设置。

Laravel

为了帮助身份验证过程正常工作,Laravel 使用了「Providers」和「Guards」。它大大减少了开发人员的工作,因为他只需要添加数据库、控制器和模型。如果一切正常,Laravel 会自行提供指向该应用程序的链接。

要将用户登录到您的应用程序,您可以使用 Auth::attempt 方法
learnku.com/docs/laravel/8.x/authe...

Laravel 的身份验证服务是通过 Auth 门面访问的,因此请确保在类的顶部导入 Auth 门面

if (Auth::attempt (array('email' => $email, 'password' => $password), true))
{
      //The user is being remembered…
}

2. SQL 注入

黑客大多试图通过 SQL 注入攻击获取对信息系统的访问权限,然后将恶意 SQL 语句插入表单域或其他注入点,以获取对数据库的未授权访问,并以此牟利。这就是他们如何访问易受攻击的数据库并有机会攻击底层系统。

黑客大多试图通过 SQL 注入攻击获取对信息系统的访问权限,然后将恶意 SQL 语句插入表单域或其他可以注入点,以获取对数据库的未授权访问,并以此牟利。 这就是他们如何访问易受攻击的数据库并有机会攻击底层系统。

为了保护 PHP 项目免受 SQL 注入攻击,Laravel 查询构建器使用 PDO 参数绑定。 一旦绑定了此参数,开发人员就不必保护作为绑定传递的值。 Laravel 是一个非常方便的框架,它允许开发人员通过简单的方式执行任务,例如运行原始 SQL 查询。 但是,尽可能避免此功能,因为原生 SQL 查询可能会造成 SQL 注入。

这里需要注意一件重要事情,您不能将列名与 PDO 绑定。这就是为什么您应该避免使用用户输入的参数来指定表的列名。这也结合了「ORDER BY」语句中使用的列。针对白名单检查列名称将为您提供一些灵活性。

Laravel

一些常见的 SQL 注入示例:

  1. 检索隐藏数据,它使您可以修改 SQL 查询以返回额外的结果。
  2. 颠覆应用程序逻辑,它使您可以更改查询以干扰系统信息。
  3. 联合攻击,它使您能够从不同的数据库检索数据并对其进行检查,以提取数据库的版本和结构信息。
  4. 盲目 SQL 注入,此处您控制的查询结果不会在应用的响应中返回。

3. Laravel 防范 CSRF 攻击

CSRF,也称为跨站点请求伪造,是黑客的一种古老技术,他们诱使用户执行他们最初不想执行的操作(例如点击)。通过这种方式,黑客在一定程度上规避了不允许两个网站相互干扰的同源策略。

此攻击的影响是什么?
用户因黑客而做出了不必要的行为,可能导致更改其邮箱地址、更改密码或者把钱从他们的账户转到黑客的账户上。这取决于黑客获得到多少访问权限。在某些情况下,黑客能够获得对其系统的管理控制权。

Laravel 如何在 CSRF 期间提供帮助?
Laravel 跟踪每个活动用户的会话,并自动为每个会话生成 CSRF 令牌。此令牌有助于让系统知道发出身份验证请求的用户是原始用户还是其他人。

4. XSS 防护

XSS 攻击基于一个最简单的黑客原理,那就是找到网站的弱点,并利用弱点(漏洞)注入恶意代码来访问网站。如果他们成功注入恶意代码,他们就可以完全地控制受害者的网站。XSS 不仅能让黑客窃取数据,甚至可以更改整个网站的内容。

XSS Protection

示例:黑客向一个博客平台输入一个简单的消息代码

<script>alert("你被黑了!")</script>

现在,每次当有人打开这个网站上的博客时,消息就会弹出来。这只是一个例子。黑客也可以渗透得更深一些,也可以注入更危险的代码。

Laravel 如何针对 XSS 进行防护

Laravel 原生支持在遭到 XSS 攻击时保护代码和网站数据库。如今的框架使得程序更容易避开不受信任的用户的输入并减轻 XSS 攻击。最常用的框架是 React JS、AngularJS 和 Ruby on Rails,都可以帮助避免这些漏洞。这些框架可能在某些方面有一些局限性,但是他们在避开用户非法输入和帮助减轻 XSS 攻击方面具有很大的作用。

在预防 web 安全漏洞上,你应该使用白名单而不是黑名单。因为大家认为黑名单对于 web 应用程序的保护不太有效,稍有经验的黑客很容易就可以绕过黑名单过滤器。

对输出内容的编码是应对此类 web 攻击的终极方案,因为它将不受信任的输入内容转化成了安全的编码后的内容,这意味着输入内容会作为数据展示给用户,而不是作为代码在浏览器中运行。这就是如何将特殊字符翻译成不会被浏览器当成代码而运行的形式。

需要理解的很重要的一件事是,输出的编码取决于数据存储或输出的上下文。例如,上下文可以是 HTML 、 HTML 实体 、 HTML 属性 、 JavaScript 上下文 、 CSS 上下文。

为避免 XSS ,一种办法是启用有效的内容安全策略(CSP)。

5. HSTS

HSTS 是什么?

HSTS 或 HTTP 的严格传输安全性是一种非常高级的 web 安全策略。它强制 web 浏览器仅通过安全连接(HTTPS)进行交互(而不是 HTTP)。

网站使用 HSTS 来声明自己是安全的,并且只能使用 HTTPS 安全链接进行访问,并帮助网站阻止不接受 SSL 证书的不安全的用户。简单来说,HSTS 是一个广泛使用的术语,确保用户的浏览器始终通过 HTTPS 进行访问。所以,使用 HSTS,你不需要将用户从 http:// 重定向到 https:// 。

HSTS 防护针对什么?

黑客们总是在你网站中安全薄弱的附近潜伏着,HSTS 可以保护你免受中间人攻击(MITM)、恶意代码注入、session 劫持。

具有 HSTS 的网站不会受到支持 SSL 的网站中另外两个漏洞的影响,即 SSL 协议攻击和 cookie 劫持。除了可以使网站更安全之外,HSTS 还可以通过消除加载过程中不必要的步骤来加快网页的加载速度。

6. 敏感数据暴露

几乎每个月我们都会听到一些关于黑客集团如何破坏一家大公司甚至是一个国家的数据库的新闻。尽管是知名度很高的公司,他们还是在安全措施上做得比较薄弱。造成这种情况的两个主要原因是不安全的 S3 buckets 和 弱哈希密码。通过以下步骤,就可以避免这种损害:

  • 你的整个应用程序应该只在 HTTPS 上运行,没有 TLS 证书也不行。为尝试使用 HTTP 的用户写入 HSTS 头来提供安全的访问方式。
  • Laravel 在使用自适应盐哈希函数来保护密码的这方面做得非常出色,它支持 Bcrypt 和 Argon2。强烈推荐!
  • 不要在加密存储敏感数据这件事上花费更多的时间和精力了,为什么不用 Laravel 已经有的加密功能呢。

另一个大部分开发人员容易犯的可怕的错误是信任用户上传的文件。即便你的用户都是真实的人类,他们也不知道他们上传的文件是否安全,他们也不会验证文件是否包含恶意程序或病毒。这样的话,会对整个系统造成很大的风险隐患。OWASP 在这里可以派上用场。它的「无限制文件上传」页面允许你对此类文件采取预防措施。以下是你需要使用的 Laravel 的验证功能所需的操作:

  • 设置用户上传文件的大小的上限和下限。
  • 如果用户连续上传文件,对其进行限制。
  • 根据你的安全要求,对上传的文件进行重命名。
  • 永远不要将文件上传到公共目录。
  • 使用 AWS 等第三方对象存储。

这些都可以和 Laravel 的规则放在一起。

如果系统解析 XML,会经常发现系统容易受到攻击。这种漏洞多年前也曾出现在 Facebook 上。为了抵御这种攻击,需要使用 libxml_disable-entity-loader 函数,在使用 PHP XML 解析器是禁用解析外部实体。

如果无法禁用此功能,请使用最新版本的 XML 解析器和 SOAP。用户上传的 XML 应被重点关注。

7. 中断访问控制

如果你还记得 10 年前的 2011 花旗集团事件,当时黑客拿到了 20 多万条管理不善的用户数据,你就会明白控制中断的重要性。授权验证非常重要,你不能使用 URL 中的数字来储存客户的关键数据。这件事为什么是重中之重:

  • 如果你的用户登录了账户,最重要的是验证身份以确保当前是否是该账户本人访问。
  • 使用基于角色的控制包(Role-Based Access Control),这样 Laravel 就具备了管理用户权限的功能。

8. 安全错误配置

记住,一个高效的系统是运行在功能最少但最重要的功能上的系统。关闭所有你不需要的附加功能。为什么要给您的系统增加负担并使它们容易出现风险?因此,要经常注意以下几点:

  • 任何在您的服务器或您的网站应该是最新的。
  • 不允许您的 web 服务器的访问目录列表。
  • 调试不利于对某些类型的数据和信息保密,因此,请禁用它。

当涉及到保护您的 web 或在线 PHP 项目免受恶意攻击时,这些是一些最佳实践。正如我们所看到的,Laravel 为您的项目提供了一个惊人的安全层,并加强了您的 web 服务器的防御漏洞的平台。OSWP 的检查列表为开发人员打开了一个广阔的场景,在那里他们可以了解如何调整一些更改,以获得针对常见 web 攻击的最大安全性。

9. 日志和监控不足

平均而言,破解大多需要 200 多天才能被发现。在这段时间内,您的系统很容易受到攻击,黑客可以轻易地窃取您的重要或敏感数据。但是,通过记录和监视所有执行的任务和活动,可以发现这些违规行为。

Laravel 能帮上什么?

随着 Monolog 作为一个标准,Laravel 使您能够集成一个像书面记录这样的第三方服务,这意味着它记录每一个活动的网站或应用程序,如登录,请求忘记密码或重置。无论是谁在执行这些活动,一个成员或一个管理员,所有他们都得到记录在一个彻底和广泛的审计跟踪记录。

缺少或无效的事件响应集成使黑客能够进入软件系统并对服务器数据进行未经授权的控制。但是,记录所有数据可以使您避免这种数据泄露。通过接收特定日志事件的警报,使用 Laravel 是让自己意识到任何可疑活动的最佳方法。

点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注