Eloquent ORM(laravel 5)是否负责SQL注入?

时间:2017-01-08 23:34:51

标签: laravel pdo orm eloquent sql-injection

我在网上找不到它,但Eloquent ORM是否像PDO预处理语句一样处理SQL注入呢?

3 个答案:

答案 0 :(得分:12)

没有框架“负责”SQL注入。

负责SQL注入。

框架可以提供方便的方法,但您仍然必须始终如一地使用这些方法。

例如,您应该使用查询参数而不是将变量连接到SQL表达式中。

重新评论:

Eloquent有像whereRaw()这样的方法,可以让你编写任何你想要的表达式。这是an example from the Eloquent docs

$users = User::whereRaw('age > ? and votes = 100', [25])->get();

如果对参数使用此?语法,并将值作为数组参数传递,则是,您可以安全地依赖Eloquent来使用参数化。

准确地说“Eloquent负责SQL注入”,因为这导致一些天真的开发人员认为你可以做这样不安全的事情:

$users = User::whereRaw("age > {$_GET['age']} and votes = 100")->get();

他们错误地认为Eloquent可以为你神奇地修复它。 事实并非如此。

每个ORM都提供了将应用程序变量组合到查询中的安全方法,但也提供了开发人员可以绕过的方法。他们必须提供这些方法,因为总有一些查询无法参数化。

当我说你正确使用ORM并避免使用不安全的代码时,这就是我的意思。

答案 1 :(得分:3)

根据您的问题,所有雄辩的查询都会得到解决 SQL注入,因为它们在核心中使用PDO驱动程序。那么你 不必担心,但输入会按原样存储,以便您可以 想根据您的应用需求进行消毒(HTML格式化, 等)

答案 2 :(得分:1)

是的,但是你仍有责任验证进入的数据,并将数据转出,因为准备好的声明只是图片的一部分。

作为旁注 - 我不认为依赖注入意味着你认为它意味着什么。 Laravel通过其服务容器进行依赖注入,但DI实际上是一件好事(https://en.wikipedia.org/wiki/Dependency_injection