我需要对用户输入进行净化吗,Laravel?

14

我正在使用带有Eloquent的Laravel 4。 当我获取用户输入时,我只是使用$name=Input::get('name'),然后我执行$a->name=$name;

我不知道Input::get函数是否能够保护我免受SQL注入和XSS攻击。如果不能,我该如何对输入进行清理?

并且,在我的视图中显示值时,我应该使用{{$a}}还是{{{$a}}}


1
除了其他答案之外,如果您决定使用类似于new Something(Input::all())的东西,请确保在Something模型中指定$fillable字段,以防止大规模分配。这与您的问题不完全相关,但需要注意。 - Yasen Slavov
4个回答

18

Eloquent ORM使用PDO的参数绑定,因此无需担心SQL注入。当您使用原始SQL时,也应该使用参数绑定。

Input::get()不会过滤任何内容。

双大括号(在已停用的版本中为三个)与e()和HTML::entities()相同。它们都使用UTF-8支持调用htmlspecialchars:

htmlspecialchars($your_string, ENT_QUOTES, 'UTF-8', false);

如果我使用{{{来显示它,保存信息时是否也应该使用htmlentities? - FooBar
3
转义输出,而不是输入。 - cha-cha
2
除非你确实要使用它,否则没有必要更改数据。过滤输入,转义输出。 - cha-cha
应该指出的是,Laravel提供了原始SQL查询支持,但这种支持并没有受到注入攻击的保护。因此,总有可能会有人构建一个需要手动清理一些原始查询的网站。 - AdamJones

5

您应该使用{{{$a}}},因为例如输入可能具有HTML标记。 Laravel不会对其进行过滤。

为了避免SQL注入,您应该绑定参数运行查询,例如:

$var = 1;
$results = DB::select('select * from users where id = ?', array($var));

而不是:

$results = DB::select('select * from users where id = '.$var);

那我应该使用 htmlentities 或类似的东西吗?Input::get 过滤器是什么? - FooBar
据我所知,它是用于获取 POST、GET 等数据的接口。它会修剪数据但不会过滤它,因此在显示时应使用三级大括号——这样变量值上将运行 htmlentities 函数。 - Marcin Nabiałek
如果我使用{{{来显示它,保存信息时是否也应该使用htmlentities? - FooBar
但是如果我在数据库中保存了一个损坏的输入,会有什么问题吗? - FooBar
关于您的评论,我猜我不会有绑定参数的问题,因为我使用 Eloquent。 - FooBar
显示剩余4条评论

-1

这将返回用引号括起来的已过滤字符串,以便在SQL查询中安全使用:

$safe_string = DB::connection()->getPdo()->quote($unsafe_string);

没有任何理由使用这个函数。 - Your Common Sense

-1

在编程中,您总是需要将干净的数据保存在数据库中,为此我使用了HTML Purifier

HTML Purifier是一个符合标准的HTML过滤器库,用PHP编写。HTML Purifier不仅会使用经过彻底审核、安全但宽容的白名单删除所有恶意代码(更好地称为XSS),而且还会确保您的文档符合标准,这只有通过全面了解W3C规范才能实现。由于当前缺乏或不安全的HTML过滤器,厌倦了使用BBCode?拥有所见即所得编辑器,但从未能够使用它?正在寻找高质量、符合标准、开源组件以用于您正在构建的应用程序?那么HTML Purifier就是为您而设计的!

对于Laravel项目,您可以使用此服务提供程序https://github.com/mewebstudio/purifierHTMLPurifier包含在您的项目中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接