如何在Laravel中应用XSS保护?

2022-08-30 16:51:27

我想知道如何在Laravel中提供XSS保护(如果有的话)。我在文档中找不到有关它的任何内容。

问题

我正在使用Eloquent的方法将数据插入数据库(/属性在模型中设置)。事实证明,我可以自由地将这样的东西放在任何表单的文本输入中:create()$fillable$guarded

<script>alert('Hacking Sony in 3...2...')</script>

,则该值将插入到数据库中。然后,在进行时 - 显示警报。echo

可能的解决方案

现在,Laravel是一个非常好的框架,所以我认为一定有一些东西可以防止XSS开箱即用。但是,我无法找出那是什么。

如果我错了,处理问题的最佳方法是什么?

  • 我是否使用花哨的正则表达式验证来禁止特定字符?
  • 我是否每次使用都使用?mysql_real_escape_string()Input::get()
  • 我呢?strip_tags()

仅靠视图级转义是不够的

我知道我可以使用Blade的三重大括号来转义视图中的字符串,但这不是重点。对我来说,首先不要让那些偷偷摸摸的混蛋进入数据库更有意义。

有人已经遇到过这个问题了吗?


答案 1

对我来说,首先不要让那些偷偷摸摸的混蛋进入数据库更有意义。

实际上-这不是真的。

XSS仅由刀片处理的原因是XSS攻击是一个输出问题。如果您存储在数据库中,则没有安全风险 - 它只是文本 - 它没有任何意义。<script>alert('Hacking Sony in 3...2...')</script>

但是在HTML输出的上下文中 - 那么文本具有含义,因此这就是应该进行过滤的地方。

此外 - XSS攻击可能是反射攻击,其中显示的数据不是来自数据库,而是来自其他来源。即上传的文件,网址等。如果您无法过滤所有不同的输入位置 - 您将面临丢失某些内容的风险。

Laravel鼓励你逃避所有的输出,无论它来自哪里。由于特定原因,您只应显式显示未筛选的数据 - 并且仅当您确定数据来自受信任的来源(即来自您自己的代码,从不来自用户输入)时。

p.s. 在 Laravel 5 中,默认值将转义所有输出 - 这突出了这一点的重要性。{{ }}

编辑:这是一个很好的讨论,关于为什么你应该过滤输出,而不是输入:html / XSS转义输入与输出


答案 2

据我所知,“官方”Laravel的立场是XSS预防的最佳实践是逃避输出。因此。{{{ }}}

您可以通过输入环境来补充输出转义,使用 、 和 :Input::all()strip_tags()array_map()

$input = array_map('strip_tags', \Input::all());

推荐