【问题标题】:Secure laravel query which use DB::Raw使用 DB::Raw 的安全 laravel 查询
【发布时间】:2016-10-31 10:36:57
【问题描述】:

我真的是 Laravel 的新手,我不确定如何保护使用 DB::RawSQL Injections 查询。我已经阅读了documentation 的低谷,并且我读过它有点不安全,应该保护它,因为它作为字符串注入到查询中......

这些表达式将作为字符串注入到查询中,因此请注意不要创建任何 SQL 注入点

我的查询看起来像这样

DB::table('sub_category as sc')
    ->leftJoin('products as p', 'p.sub_cat_id', '=', 'sc.sub_cat_id')
    ->where('sc.category_id', '=', $categoryId)
    ->whereNotNull('p.sub_cat_id')
    ->select('p.*','sc.*', DB::raw('sc.sub_cat_id AS sub_cat_id'))
    ->groupBy('sc.sub_cat_id')
    ->get();

查询仅在页面上显示包含产品的类别。

【问题讨论】:

  • db:raw() 调用不使用任何用户提供的输入,因此可以安全地防止 sql 注入。
  • 所以就像在 php 中一样,我只需要担心和保护用户输入、表单等的查询吗?剩下的 Laravel 会小心,因为使用的是 PDO,对吧?
  • 这取决于 laravel 是否使用带有 pdo 的预处理语句。我不知道 laravel,所以无法帮助你。可能一个快速的谷歌搜索会为你确认这一点。
  • 在他们的文档中.. 与我发布的问题相同的链接:Note: The Laravel query builder uses PDO parameter binding throughout to protect your application against SQL injection attacks. There is no need to clean strings being passed as bindings.。好的,谢谢。

标签: php mysql laravel-4


【解决方案1】:

如果有数据通过 $_GET['foo']$_POST['bar'] 从网络用户。您应该通过将数据绑定到原始查询来保护您的数据库免受 SQL 注入,如下所示:

$risky_input=$_GET['some_risky_input'];//assuming this comes from an input field
$result=
DB::select(
    DB::raw("SELECT * FROM category WHERE category_name=:queriedterm ")
    ,['queriedterm'=>$risky_input]//binds data throuhg array
    )
;

请注意冒号“:”和它旁边的变量。这将保护您的查询免受 sql 注入。

注意:您的查询没有任何 slq 注入风险,因为它不包含来自网络用户填写的任何文本输入字段的参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-02
    • 2018-04-15
    • 2018-01-31
    • 2020-06-10
    • 2017-06-14
    • 2019-11-23
    • 2018-10-24
    • 1970-01-01
    相关资源
    最近更新 更多