【问题标题】:In Laravel, how do you bind parameters in DB raw query when you set model attribute?在 Laravel 中,设置模型属性时如何在 DB 原始查询中绑定参数?
【发布时间】:2022-01-07 06:35:59
【问题描述】:

例如,我有我的代码。

$news = new News();
$news->title = 'hello world';
$new->user = $user_id,
$news->urlcc = DB::raw('crc32("'.$args['newsShortUrlInput'].'")');
$news->save();
$news->refresh();

这里带有属性 $news->urlcc 来自使用mysql函数 crc32() 后的用户输入; 对于SQL注入问题,以上代码不安全。

所以,我的问题是如何将 DB::raw() 中的参数与 Laravel 模型绑定,如下所示。

$news->urlcc = DB::raw('crc32(:newsShortUrlInput)', ['newsShortUrlInput' => $args['newsShortUrlInput]);

谢谢,

【问题讨论】:

  • 不,那是模型选择,我正在尝试使用 Laravel 模型创建记录。
  • 这回答了你的问题:stackoverflow.com/a/20873009/7698734
  • 据我所知,那是不可能的。绑定不能在 DB::raw 中传递,并且您通常无权访问为保存模型而创建的构建器对象以以这种方式添加绑定。对于这种特殊情况,您可以改用 PHP crc32
  • 所有向我展示如何在 select 语句中绑定参数的建议都不符合我的条件。我的案例是尝试创建新的 Laravel 模型。我找到了一种解决方案,见下文。谢谢

标签: laravel model code-injection raw


【解决方案1】:

我找到了一种解决方案,但不确定它是正确的还是完美的解决方案。

在News模型类中重写setAttribute,见下文。

public function setUrlcrcAttribute($shortUrl)
{
    $this->attributes['urlcrc'] = $this->getConnection()->select('select crc32(?) as urlcrc', [$shortUrl])[0]->urlcrc;
}

在您的服务类中创建一个新模型,如下所示。

$news = new News();
$news->title = 'hello world';
$new->user = $user_id,
$news->urlcrc = $args['newsShortUrlInput']; // Laravel model will try to build the real attribute urlcrc
$news->save();
$news->refresh();

它对我有用,但不确定这是否是完美的解决方案。

【讨论】:

    猜你喜欢
    • 2018-08-11
    • 1970-01-01
    • 2014-01-18
    • 2022-01-22
    • 2021-10-02
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多