有人告诉我,我应该使用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')));
答案 0 :(得分:1)
这是真的吗?查询生成器不仅仅用于使查询代码更具可读性吗?
是的,这是真的。 Query Builder通过使用PDO的参数化查询来帮助防止SQL注入攻击。
直接来自documentation for Query Builder:
注意:Laravel查询构建器始终使用PDO参数绑定来保护您的应用程序免受SQL注入攻击。无需清除作为绑定传递的字符串。
例如,从安全方面选择以下两种数据方式有何不同?第一个仅用于使过程更漂亮吗?
是的,这两种方法之间存在很大差异。在第一个查询中,用户输入始终在插入数据库之前进行清理。在第二种方法中,您要插入原始用户输入。 Bobby-Tables想和你谈谈!
答案 1 :(得分:1)
使用原始sql和查询buider或ORM之间存在很大差异。我可以给你写一些:
我可以继续其他的东西,不过在我身边,我虽然它可以帮助你找到你想要的东西
答案 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注入攻击。无需清除作为绑定传递的字符串。
希望这会有所帮助:)
EDIT
此外,使用框架而不是编写特定于单个或一组数据库的查询可能是一种好习惯。
假设您出于某种原因决定转移到另一个数据库。框架将“自动”执行此操作(如果设置为 - 您应该告诉您使用的数据库类型),而不是重写每个查询(并首先找到它们)