Xra保护如何以及在何处应用于Laravel?

les*_*gar 15 php xss laravel laravel-4

我想知道Laravel提供的XSS保护(如果无论如何).我在文档中找不到任何相关内容.

问题

我使用Eloquent的 create()方法将数据插入数据库($fillable/ $guarded属性在模型中设置).事实证明,我可以在任何形式的文本输入中自由地输出这样的内容:

<script>alert('Hacking Sony in 3...2...')</script>
Run Code Online (Sandbox Code Playgroud)

并将值插入数据库中.然后,当echo它进入时- 显示警报.

可能的解决方案

现在,Laravel是一个非常好的框架,所以我认为必须有一些东西可以防止XSS开箱即用.但是,我不知道那是什么.

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

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

视图级转义是不够的

我知道我可以使用Blade的三重花括号来避开视图中的字符串,但这不是重点.让我更有意义的是不要让那些偷偷摸摸的混蛋进入数据库.

有人遇到过这个问题吗?

Lau*_*nce 35

让我更有意义的是不要让那些偷偷摸摸的混蛋进入数据库.

实际上 - 这不是真的.

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

但是在HTML输出的上下文中 - 那么文本有意义,因此这就是过滤应该发生的地方.

此外 - XSS攻击可能是一种反射攻击,其中显示的数据不是来自数据库,而是来自其他来源.即上传的文件,网址等.如果您未能过滤所有各种输入位置 - 您可能会遗漏某些内容.

Laravel鼓励你逃避一切输出,无论它来自哪里.您应该仅由于特定原因明确显示未过滤的数据 - 并且仅当您确定数据来自可信来源(即来自您自己的代码,而不是来自用户输入)时.

ps在Laravel 5中,默认设置{{ }}将转义所有输出 - 这突出了这一点的重要性.

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

  • 我同意在存储之前操作每个输入可能是一种矫枉过正。但是,我对这种“仅输出”方法有不同的看法。即使 `&lt;script&gt;...&lt;/script&gt;` 是一个有效的用户名,它也不应该是。至少在文本输入字符串方面,像 `&lt;script&gt;` 应该被禁止。另一方面,`textarea`s 自然允许许多不同的字符,这里输出转义是对抗 XSS 的唯一最佳方式。最后,我想,这一切仍然是个人选择。感谢您分享您所知道的。很有帮助。 (2认同)
  • @lesssugar:您可以使用输入验证作为针对 XSS 的第二层防御,尽管正如 The Shift Exchange 所说,重点绝对应该放在输出清理上。例如,您不应该将“&lt;script&gt;”作为用户名的无效序列列入黑名单,但您可能有一条业务规则规定所有用户名必须是字母数字。在这种情况下,您应该验证您的输入,但决不能替代输出上的正确编码。如果您的业务规则稍后更改为允许字符“&lt;/&gt;”,您不希望您的网站突然变得容易受到攻击。 (2认同)

bis*_*hop 7

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

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

$input = array_map('strip_tags', \Input::all());
Run Code Online (Sandbox Code Playgroud)

  • 一种方法。我目前还使用 `array_map()` 来清理 `Input`s。我仍然认为 `{{{}}}` 是最后的手段。 (2认同)

Rob*_*llo 5

我检查了Laravel {{{...}}}对xss攻击的防护。它只htmlentities()是以这种方式使用该功能:htmlentities('javascript:alert("xss")', ENT_QUOTES, 'UTF-8', false);仅当您正确使用它时,它才能保护您免受xss的侵害,这意味着不要在某些HTML标记中使用它,因为这将导致XSS攻击的可能性。例如:

$a = htmlentities('javascript:alert("xss")', ENT_QUOTES, 'UTF-8', false); 
echo '<a href="'.$a.'">link</a>';
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它很容易受到xss的攻击。

  • @alex正确的转义可以防止破坏您的布局(并执行黑客的JavaScript)。但是在某些地方切换到javascript上下文是合法的(onclick,onerror,href),“转义”不能阻止它。您必须先验证和清除数据,然后再将其插入此类位置。我强烈建议您阅读[QWASP XSS预防速查表](https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet) (2认同)

小智 5

class XSSProtection
{
    /**
     * The following method loops through all request input and strips out all tags from
     * the request. This to ensure that users are unable to set ANY HTML within the form
     * submissions, but also cleans up input.
     *
     * @param Request $request
     * @param callable $next
     * @return mixed
     */
    public function handle(Request $request, \Closure $next)
    {
        if (!in_array(strtolower($request->method()), ['put', 'post'])) {
            return $next($request);
        }

        $input = $request->all();

        array_walk_recursive($input, function(&$input) {
            $input = strip_tags($input);
        });

        $request->merge($input);

        return $next($request);
    }
}
Run Code Online (Sandbox Code Playgroud)