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转义
据我所知,"官方"Laravel的立场是XSS预防最佳实践是逃避输出.因此,{{{ }}}.
您可以使用,和,通过输入卫生来补充输出转义:Input::all()strip_tags()array_map()
$input = array_map('strip_tags', \Input::all());
Run Code Online (Sandbox Code Playgroud)
我检查了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的攻击。
小智 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)