通过检查来自应用服务器的传入查询,拒绝异常查询,从而保护您的数据。
例如,以下是 Web 服务器通常与数据库服务器交互的方式:

通过在数据库服务器前添加 DBShield,我们可以保护其免受异常查询的侵害。为了检测异常查询,我们首先以学习模式运行 DBShield。学习模式允许任何查询通过,但会记录其信息(模式、用户名、时间和来源)到内部数据库中。

收集到足够多的模式后,我们可以以保护模式运行 DBShield。保护模式能够区分异常查询模式、用户和来源,并根据配置采取相应措施。

在演示中,我们使用 sqlmap(自动 SQL 注入和数据库接管工具)来利用 user.php 中的 SQL 注入漏洞。
在第一种场景中,当 Web 应用直接连接数据库(MySQL)时,sqlmap 成功利用了 SQL 注入。在第二种场景中,我们修改了 user.php,使 DBShield 位于 Web 应用和数据库之间,它将丢弃注入尝试,导致 sqlmap 失败。

命令行界面
$ go run main.go
2016/10/15 16:25:31 [INFO] 配置文件: /etc/dbshield.yml
2016/10/15 16:25:31 [INFO] 内部数据库: /tmp/model/10.0.0.21_postgres.db
2016/10/15 16:25:31 [INFO] 监听: 0.0.0.0:5000
2016/10/15 16:25:31 [INFO] 后端: postgres (10.0.0.21:5432)
2016/10/15 16:25:31 [INFO] 保护: true
2016/10/15 16:25:31 [INFO] Web 界面在 https://127.0.0.1:8070/
2016/10/15 16:25:33 [INFO] 连接来自: 10.0.0.20:35910
2016/10/15 16:25:33 [INFO] 连接到: 10.0.0.21:5432
2016/10/15 16:25:33 [INFO] SSL 连接
2016/10/15 16:25:34 [DEBUG] 客户端握手完成
2016/10/15 16:25:34 [DEBUG] 服务器握手完成
2016/10/15 16:25:34 [INFO] 用户: postgres
2016/10/15 16:25:34 [INFO] 数据库: test
2016/10/15 16:25:34 [INFO] 查询: SELECT * FROM stocks where id=-1 or 1=1
2016/10/15 16:25:34 [WARN] 未找到模式: [53 55 51 52 55 52 50 53 55 51 53 49 115 116 111 99 107 115 53 55 51 53 50 105 100 54 49 52 53 53 55 51 55 57 53 55 52 48 52 53 55 51 55 57 54 49 53 55 51 55 57] (SELECT * FROM stocks where id=-1 or 1=1)
2016/10/15 16:25:34 [WARN] 正在断开连接
Web 界面

获取它
$ go get -u github.com/nim4/DBShield
然后可以使用 "-h" 参数查看帮助:
$ $GOPATH/bin/DBShield -h
DBShield 1.0.0-beta3
用法: DBShield
-a 获取异常查询列表
-c 文件
配置文件 (默认 "/etc/dbshield.yml")
-h 显示帮助
-k 显示解析后的配置并退出
-l 获取捕获的模式列表
-version
显示版本
并使用您的配置运行它,例如:
$ $GOPATH/bin/DBShield -c config.yml
参见 示例配置文件
⚠️ 警告: 请勿在生产环境中使用默认证书!
| 数据库 | 保护 | SSL |
|---|---|---|
| DB2 | ![]() | ![]() |
| MariaDB | ![]() | ![]() |
| MySQL | ![]() | ![]() |
| Oracle | ![]() | ![]() |
| Postgres | ![]() | ![]() |
(按优先级排序)