在Query Builder / raw MySQL中编写的查询之间有区别吗?

时间:2014-02-22 14:51:28

标签: php mysql laravel laravel-4

有人告诉我,我应该使用Laravel中的Fluent Query Builder而不是原始的MySQL查询,因为Fluent会阻止SQL注入和其他类型的恶意用户输入攻击,因此查询这种方式更安全。这是真的?查询生成器不仅仅用于使查询代码更具可读性吗?

例如,从安全方面选择以下两种数据方式有何不同?第一个仅用于使过程更漂亮吗?

DB::table('users')->where('name', Input::get('name'))->get();
DB::select(DB::raw('SELECT * FROM users WHERE name = ' . Input::get('name')));

3 个答案:

答案 0 :(得分:1)

  

这是真的吗?查询生成器不仅仅用于使查询代码更具可读性吗?

是的,这是真的。 Query Builder通过使用PDO的参数化查询来帮助防止SQL注入攻击。

直接来自documentation for Query Builder

  

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

  

例如,从安全方面选择以下两种数据方式有何不同?第一个仅用于使过程更漂亮吗?

是的,这两种方法之间存在很大差异。在第一个查询中,用户输入始终在插入数据库之前进行清理。在第二种方法中,您要插入原始用户输入Bobby-Tables想和你谈谈!

Obligatory XKCD

答案 1 :(得分:1)

使用原始sql和查询buider或ORM之间存在很大差异。我可以给你写一些:

  • RAW SQL使用的内存少于查询生成器,导致查询构建器调用其他函数并使用一些内存RAM
  • RAW SQL无法安全防止SQL注入,查询构建器具有SQL执行目标之一。
  • 如果您没有良好的SQL知识,RAW SQL可能会更难,然后查询构建器更容易管理简单和复杂的查询
  • 制作错误的RAW SQL查询,可能意味着错误的内存使用并导致系统崩溃,但是Query Builders已经过优化,可以高效地制作和执行复杂的SQL查询
  • RAW SQL用于特定引擎,另一方面,查询构建器用于为许多引擎准备SQL

我可以继续其他的东西,不过在我身边,我虽然它可以帮助你找到你想要的东西

答案 2 :(得分:0)

我不知道框架,但我可以猜一下:)

使用Fluent Query Builder时     DB :: table('users') - > where('name',Input :: get('name')) - > get(); 在运行查询之前,输入可能正在经历多个验证(和安全性)步骤。

我还没有阅读完整的文章,但在这里他们描述了许多预防注射的方法。 https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

此外,我发现Laravel Fluent Query Builder使用PDO参数绑定(链接中的第一个方法),因此它们不只是像您提议的那样创建一个“简单”的SQL查询。

  

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

     

http://laravel.com/docs/queries

希望这会有所帮助:)

EDIT
此外,使用框架而不是编写特定于单个或一组数据库的查询可能是一种好习惯。 假设您出于某种原因决定转移到另一个数据库。框架将“自动”执行此操作(如果设置为 - 您应该告诉您使用的数据库类型),而不是重写每个查询(并首先找到它们)