首页 > 解决方案 > 这个原始 SQL 语句对 SQL 注入安全吗?

问题描述

这是我第一次在 laravel 中使用原始 sql 语句,所以我想确保这是使用它的最佳方式。

$events = DB::select("
SELECT
    *
FROM
    events
WHERE
    (
        start_date BETWEEN :start_date AND :end_date OR
        end_date BETWEEN :start_date AND :end_date OR
        :start_date BETWEEN start_date AND end_date OR
        :end_date BETWEEN start_date AND end_date
    )
AND agenda_id = :agenda_id",
[
    'start_date' => Carbon::parse($dataEvent['start_date'])->format('Y-m-d H:i:s'),
    'end_date' => Carbon::parse($dataEvent['end_date'])->format('Y-m-d H:i:s'),
    'agenda_id' => $dataEvent['agenda_id'],
]);

标签: laravel

解决方案


Laravel 提供对 SQL 注入的防御。这是因为由于查询生成器在后台使用 PDO,我们知道有一种方法可以将参数绑定到我们的查询,以便清理绑定的变量。在这里你将了解 Laravel 如何通过Raw SQL Queries防止 SQL 注入

SQL 注入风险主要出现在通常通过GETPOST请求发送数据的情况下。您应该通过将数据绑定到原始查询来保护您的数据库免受 SQL 注入:

$data = $request->name; // this comes from an input field
$query = DB::select(
    DB::raw("SELECT * FROM users WHERE name=:user_name ")
    ,['user_name' => $data] // binds data with array
    )
;

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


推荐阅读