【问题标题】:Is it safe to pass validation result directly to new object将验证结果直接传递给新对象是否安全
【发布时间】:2020-02-06 11:36:57
【问题描述】:

我已经设置了以下请求类来验证我的输入:

.
.
.
class SupplierStoreRequest extends FormRequest
{
    .
    .
    .
    public function rules()
    {
        return [
            'name' => 'required|string|max:255',
            'address' => 'required|string|max:255',
        ];
    }

}

我的控制器中有以下方法:

public function store(SupplierStoreRequest $request)
{
    $validated = $request->validated();
    $supplier = new Supplier($validated);
    $supplier->save();
    return redirect()->route('Admin::supplier.index');
}

这完全符合预期。我的问题是:

此代码中是否存在 SQL 或 JavaScript 注入风险或任何其他安全风险,或者 FormRequest 类是否会处理这些风险?

【问题讨论】:

    标签: laravel validation security code-injection laravel-6


    【解决方案1】:

    TL;DR 通过 Eloquent 准备语句并通过刀片变量使用 htmlspecialchars 转义是防止 SQL 注入和 JavaScript 注入的方法。验证只是为了检查用户输入是否符合预期的格式(甚至可以是 JavaScript 或 SQL)。

    如果您使用 Eloquent(不带 raw),则使用准备好的语句,这有助于防止 SQL 注入。验证不是此过程的一部分,仅用于检查输入的有效性,而不是用于攻击本身。

    Laravel 的数据库查询构建器提供了一个方便、流畅的 创建和运行数据库查询的接口。它可以用来 在您的应用程序中执行大多数数据库操作并适用于所有 支持的数据库系统。

    Laravel 查询构建器使用 PDO 参数绑定来保护您的 针对 SQL 注入攻击的应用程序。无需清洁 字符串作为绑定传递。

    对于 JavaScript 注入,在 Blade 文件中使用 {{ $var }} 语句时同样适用。您不应仅依靠验证来防止攻击。通过验证来防止所有形式的攻击真的非常非常困难。

    Blade {{ }} 语句自动通过 PHP 发送 htmlspecialchars函数防止XSS攻击。

    https://laravel.com/docs/5.8/blade#displaying-data

    【讨论】:

    • 我已接受您的回答。但是要清楚,您基本上是在说代码很好,但不是因为验证。如果是这种情况,那么如果您直接在答案中说明这一点可能会很有用
    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 2011-06-07
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    相关资源
    最近更新 更多