printi / db-dump-file-anonymizer
使用假数据匿名化MySQL转储文件的库
Requires
- php: ^8.0
- ext-ctype: *
- ext-mbstring: *
- ext-pcre: *
- fakerphp/faker: ^1.21
- jschaedl/byte: ^1.0
Requires (Dev)
- phpunit/phpunit: ^10.0
- squizlabs/php_codesniffer: @stable
README
概述
这个PHP库可以使用随机/假数据匿名化数据库转储文件,特别适用于在非实时环境中恢复实时数据库时的数据匿名化。这有助于降低如果非实时数据库被盗时暴露真实客户数据的风险。
工作原理
它读取本地存储(或从STDIN)中的DB转储文件,然后根据有关哪些列应被匿名化的说明,生成新的DB转储文件(或输出到STDOUT)。
它比尝试运行多个UPDATE
请求到运行中的数据库要快得多,因为数据库需要处理很多事情,如检查某些列的唯一性、索引等。
安装
要安装此库以供使用,只需运行
composer require printi/db-dump-file-anonymizer
使用方法
此库导出一个名为anonymize-db-dump
的可执行脚本。当需要库时,它安装在./vendor/bin/
文件夹中。
可以通过以下方式调用此脚本
$ ./vendor/bin/anonymize-db-dump [OPTIONS]
以下是可以用的选项
-h
或--help
:显示帮助-i FILE
或--input=FILE
:指定输入文件(MySQL的转储文件)--stdin
:从STDIN读取输入-o FILE
或--output=FILE
:指定输出文件--stdout
:将输出写入STDOUT-m MODIFICATIONS
或--modifications=MODIFICATIONS
:指定预期的修改的JSON-f FILE
或--modifications-file=FILE
:指定包含预期修改的JSON文件-l LOCALE
或--locale=LOCALE
:指定Faker使用的区域设置-q
或--quiet
:省略消息-r SIZE
或--read-buffer-size=SIZE
:指定读取缓冲区大小(例如:100,1KB,1MB,1GB)-w SIZE
或--write-buffer-size=SIZE
:指定写入缓冲区大小(例如:100,1KB,1MB,1GB)
此库使用Faker生成假(匿名)数据。您需要检查库以查看格式化程序、格式化程序的参数和区域设置的可用选项。
简单示例
$ php ./vendor/bin/anonymize-db-dump -i ./sample/dump.sql -o ./sample/dump.out.sql -f ./sample/modifications.json -l pt_BR
上面的示例将读取文件./sample/dump.sql
,然后使用文件./sample/modifications.json
中指定的修改说明,以及使用区域设置pt_BR
(巴西葡萄牙语)来生成带有本地化的假数据,生成修改后的转储文件./sample/dump.out.sql
。
如果您想将修改后的转储文件输出到STDOUT,可以将-o ./sample/dump.out.sql
替换为--stdout
。此选项很有用,如果您不想存储修改后的转储文件,而是直接使用修改后的转储文件进行数据恢复,如下面的示例所示。
$ php ./vendor/bin/anonymize-db-dump -i ./sample/dump.sql --stdout -f ./sample/modifications.json -l pt_BR | mysql -uroot -proot -h localhost -D dbname
如果您想从STDIN生成修改后的转储文件,可以将-i ./sample/dump.sql
替换为--stdin
。此选项很有用,如果您直接从mysqldump
获取转储文件,如下面的示例所示。
$ mysqldump ... | php ./vendor/bin/anonymize-db-dump --stdin --o ./sample/dump.out.sql -f ./sample/modifications.json -l pt_BR
修改的JSON指定
用于指定转储文件修改的JSON使用此结构
{
"<TABLE_NAME>": {
"<COLUMN_POSITION>": {
"quote": <BOOLEAN_VALUE>,
"format": <STRING_VALUE>,
"args": <ARRAY_OF_ARGS>,
"unique": <BOOLEAN_VALUE>,
"optional": <BOOLEAN_VALUE>,
"optional_weight": <FLOAT_VALUE>,
"optional_default_value": <VALUE>
}
}
}
基本上,我们需要指定表名,然后指定每个表的列位置(从位置1开始),然后指定列的说明。
“quote”选项用于指示值是否应该用引号括起来(true)或不用(false)。例如,数值不需要使用引号。
“format”选项用于根据Faker格式化器指定列的格式。
“args”选项用于指定调用指定格式时使用的参数数组。
“unique”选项用于指定列是否唯一,以及该列在该表中不应重复(可能在其他列或其他表中重复)。
“optional”选项用于指定列是否为可选。当列是可选时,库可能会选择字段的默认值(如果未指定默认值,则使用NULL)。
“optional_weight”用于指定有空值的可能性。值0.0表示默认值始终被使用,1.0表示默认值永远不会被使用,0.2表示有20%的概率使用默认值。
“optional_default_value”用于指定默认值。
修改示例
{
"customers": {
"2": {
"quote": true,
"format": "firstName"
},
"3": {
"quote": true,
"format": "lastName"
},
"4": {
"quote": true,
"format": "email",
"unique": true
},
"5": {
"quote": true,
"format": "phoneNumber",
"optional": true,
"optional_weight": 0.9,
"optional_default_value": null
},
"6": {
"quote": true,
"format": "lexify",
"unique": true,
"args": [
"TEST?????????"
]
}
}
}