mmeyer2k/laravel-sqli-guard

laravel的SQL注入防护插件

dev-master 2023-01-17 20:37 UTC

This package is auto-updated.

Last update: 2024-09-18 00:07:59 UTC


README

一个强制使用PDO参数化并强力防止SQL注入攻击的Laravel插件。

本包不应作为编写安全查询的替代品!!!查看注意事项

安装

composer require mmeyer2k/laravel-sqli-guard

配置

默认情况下,此包的服务提供者已自动加载

使用

此插件通过在查询准备过程中检查查询字符串中的不安全字符序列来工作。

以下查询将由于查询字符串中存在单引号字符而引发Illuminate\Database\QueryException

DB::select("select * from users where id = '$unsafe'");

为了使此查询安全并避免异常,您必须将查询编写如下

DB::select("select * from users where id = ?", [$unsafe]);

覆盖保护

要禁用保护,请使用提供的allowUnsafe函数。请注意,查询可能在命令下游的任何位置变得脆弱!

\Mmeyer2k\LaravelSqliGuard::allowUnsafe();

执行危险查询后要重新启用保护,请使用blockUnsafe

\Mmeyer2k\LaravelSqliGuard::blockUnsafe();

禁止字符序列

注意事项

遗憾的是,并非所有SQL注入场景都可以通过这种简单的检查来阻止。

盲目接受用户输入的查询仍然可能被操纵以绕过您的应用程序、泄露数据或导致拒绝服务。

可以返回数据的查询可以被操纵以泄露记录。考虑以下编写不良的假设API控制器路由

function users()
{
    $id = request('id');

    return json_encode(DB::select("select * from users where id = $id"));
}

如果提供查询字符串?id=1 or id > 1,将返回所有记录。根据上下文,这可能是严重的安全问题。

另一个担忧是,如果攻击者知道或可以猜到有关数据模式的信息,则可能存在DDoS攻击。再次使用上述函数作为示例,但现在发送的查询字符串是id= (SELECT COUNT(*) FROM users A, users B, users C, ...)。如果指定的表中有许多行,或者连接数很高,则可能会发生CPU耗尽。对information_schema的类似攻击也是可能的,但它不需要任何知识。