【问题标题】:Laravel Eloquent: is SQL injection prevention done automatically?Laravel Eloquent:SQL 注入预防是自动完成的吗?
【发布时间】:2018-12-10 02:10:34
【问题描述】:

给出示例代码(Message 是 Eloquent 模型。):

public function submit(Request $request){
    $this->validate($request, [
        'name' => "required",
        "email" => "required"
    ]);

    //database connection
    $message = new Message;
    $message->name = $request->input("name");
    $message->email = $request->input("email");

    $message->save();
}

Eloquent 是否使用参数化查询(如 PDO)或任何其他机制来防止 SQL 注入?

【问题讨论】:

  • 是的。阅读here,我将复制粘贴:Laravel 查询构建器使用 PDO 参数绑定来保护您的应用程序免受 SQL 注入攻击。无需清理作为绑定传递的字符串。

标签: php sql laravel eloquent


【解决方案1】:

是的,但是……

是的,当您依赖内置的 ORM 功能(如 $someModelInstance->save())时,它会防止 SQL injection。来自the docs

Laravel 的数据库查询构建器提供了一个方便、流畅的界面来创建和运行数据库查询。它可用于在您的应用程序中执行大多数数据库操作,并适用于所有受支持的数据库系统。

Laravel 查询构建器使用 PDO 参数绑定来保护您的应用程序免受 SQL 注入攻击。无需清理作为绑定传递的字符串。

请注意,如果您构建原始 SQL 语句并执行这些语句或使用原始表达式,您将受到自动保护。 More from the docs:

原始语句将作为字符串注入到查询中,因此您应该非常小心,不要造成 SQL 注入漏洞。

在构建原始 SQL 语句或表达式时,您应该始终使用参数化查询。有关如何在 Laravel/Eloquent 中执行此操作的信息,请参阅上面的最后一个链接(以及文档的其他部分)。

【讨论】:

  • 所以我阅读了文档,但我仍然不确定。如果你使用->whereRaw('query with binding ?', [$variableFromUser]),你还会受到sql注入的保护吗?
  • 只要您使用? 占位符并且不直接连接任何值,可以。占位符语法的作用是防止 SQL 注入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多