从Dradis导入问题到MediaWiki的自动化脚本指南

本文详细介绍如何通过Ruby脚本将Dradis中的安全评估问题自动导入MediaWiki,包括数据库连接配置、标题处理、去重机制及SSH端口转发等关键技术实现。

MediaWiki Dradis导入工具

长期以来,我一直计划将所有Dradis问题导入MediaWiki,以便更轻松地重用问题。到目前为止,每次我想重用一个问题时,都不得不打开新浏览器,返回查找使用过该问题的旧项目,然后复制粘贴到新项目中,这非常麻烦。因此,我最终下定决心,创建了一个MediaWiki虚拟机,设置过程很简单,我不会详细介绍,请参阅它们的安装说明。接下来,我创建了一些条目,并设置Dradis以确保它可以与MediaWiki通信,同样,这在Dradis指南部分有完整文档,因此我不再赘述。

然后,我有了一个完全可用的Wiki以及它与Dradis之间的通信,但问题是我已经编写了大量问题,它们隐藏在Dradis的许多项目中,我该如何提取它们?这就是这个脚本的用武之地。

脚本功能

此脚本打开您的Dradis数据库,查找所有问题,去重,然后以正确格式插入到MediaWiki中。由于我不想弄乱Dradis虚拟机,我决定获取远程数据库访问的最简单方法是使用SSH端口转发,这让我可以从开发机器访问数据库,就像它是本地的一样,而无需更改虚拟机上的任何内容。

第二个问题是与MediaWiki通信。我最初的想法是直接将条目放入其数据库,但这样做比我想象的要难,因为它不仅仅是向单个表添加条目。下一个选项是寻找一个gem来帮我完成,果然我找到了一个,mediawiki-gateway。我尝试从标准gem命令行安装它,但不幸的是失败了,因为它似乎依赖于自身,所以我不得不从GitHub源代码安装——这可能现在已经修复,但我没有尝试更新的gem。它似乎也只适用于Ruby < 2,因此我使用了1.9.3。

之后,这是一个相当简单的情况:找出问题在Dradis数据库中的存储位置,抓取它们,重新格式化,并通过gem推送它们。每次成功导入一个问题后,我生成它的哈希值,并与每个新页面的哈希值进行比较,以检查并拒绝重复项。一些仍然漏网,我认为这可能是因为一些重复项末尾有多余的空格,但数量不多,我不担心调试它。

标题处理

我将MediaWiki文章标题基于问题标题,这最初取自标记为#[Title]#的字段中的字段,如果您对标题使用不同的标签,只需编辑第10行并将值更改为您使用的任何内容。

我还必须解决其他几个问题:MediaWiki将标题限制为255个字符,因此我将标题修剪到该长度。MediaWiki不允许重复标题,因此为了删除这些,我开始在末尾添加随机数字,这意味着我必须从标题中剥离更多字符,但这应该没问题。这工作得很好,直到我得到一个以数字结尾的标题。在末尾添加新数字仍然被拒绝为重复。我试图解决这个问题,但放弃了,并尝试在开头添加数字,这有效,因此我坚持使用它。

此脚本是作为一次性黑客编写的,用于导入我的数据,我不打算维护它,但如果您确实发现问题,请告诉我,我会看看我能做些什么来修复它。

使用说明

一旦您安装了gateway gem,脚本只需要配置,这些是您应该编辑的脚本顶部的字段:

1
2
3
4
5
6
7
8
9
TITLE_FIELD = "#[Title]#"
DB_NAME = "dradispro"
DB_USER = "dradispro_db"
DB_PASSWORD = "dradispro_db_pass"
DB_PORT = 3307

MEDIAWIKI_URL = 'http://192.168.0.1/api.php'
MEDIAWIKI_USER = "robin"
MEDIAWIKI_PASSWORD = "x"

然后,从本地机器到Dradis盒子进行SSH端口转发:

1
ssh -L 3307:localhost:3306 dradispro@dradispro.local

您可以通过以下方式检查是否工作:

1
mysql --port=3307 -h 127.0.0.1 -u dradispro_db -pdradispro_db_pass -D dradispro

如果您获得连接,则表示工作正常。

现在应该只是运行脚本的问题:

1
./mediawiki_import.rb

它提供大量关于它正在做什么的输出,并在最后给出导入的问题数量的计数。

如果您想从多个Dradis副本导入,请查看脚本中的第31行,它会告诉您如何允许这一点。

下载

下载 mediawiki_dradis_import_1.0.tar.bz2

变更日志

版本1.0

首次发布

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计