【问题标题】:Is it safe to use DB :: select and others in Laravel?在 Laravel 中使用 DB :: select 和其他工具是否安全?
【发布时间】:2019-05-12 14:20:33
【问题描述】:

查询并不总是简单的,有时我需要创建一个纯 SQL 查询,查询生成器也不适合。 При использовании DB::select, подготовливаются ли переменные, которые подставлены в запрос?

这种情况下会不会有sql注入?

$mastersInCity = DB::select('SELECT
        master_user.master_id,
        masters.specialization,
        category_letter_master.category_letter_id AS master_letter,
        COUNT(*) AS count_in_city

        FROM master_user

        LEFT JOIN masters ON master_user.master_id = masters.id
        LEFT JOIN category_letter_master ON category_letter_master.master_id = master_user.master_id 

        WHERE ' . $chooiseId . ' = ' . $cityId . ' GROUP 

        BY master_user.master_id, master_letter');

或者,这种情况下,直接使用PDO比较好,这样自己手动准备请求,可以吗?

【问题讨论】:

  • 在很多情况下,使用诸如 Doctrine 或 Eloqent 这样的 ORM 应该可以避免使用 DB::select 的必要性。如果这种查询方式是绝对必要的,那么清理用户输入的数据总是一个好主意。

标签: laravel laravel-5 query-builder laravel-query-builder


【解决方案1】:
$mastersInCity = DB::select('SELECT
    master_user.master_id,
    masters.specialization,
    category_letter_master.category_letter_id AS master_letter,
    COUNT(*) AS count_in_city

    FROM master_user

    LEFT JOIN masters ON master_user.master_id = masters.id
    LEFT JOIN category_letter_master ON category_letter_master.master_id = master_user.master_id 

    WHERE ? = ? GROUP 

    BY master_user.master_id, master_letter', [$chooiseId, $cityId]);

这相当于一个准备好的语句。

文档:https://laravel.com/docs/5.7/database#running-queries

编辑:我相信这可以通过 eloquent 简单地完成,这里没有什么太复杂的地方。比如:

MasterUser::with(['master', 'master_letter'])->withCount()->where($chooiseId, $cityId)->get()

【讨论】:

    猜你喜欢
    • 2018-10-15
    • 1970-01-01
    • 2018-08-02
    • 2010-12-17
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2015-10-27
    • 2012-10-23
    相关资源
    最近更新 更多