我是Python的新手,坚持简单的任务,现在看起来一点也不简单。
所以基本上,这个想法是向开发团队提供一个模糊的MySQL转储。
转储中充满了带有客户电子邮件的INSERT语句,其想法是用一些随机散列(随机很重要,因为UNIQ索引)替换用户名,并替换域名。
我尝试使用re.sub,它可以完成这项工作,但前提是每行只有一个正则表达式匹配。不幸的是,INSERT语句在一行中有很多电子邮件,所以我想知道我错过了什么吗?
基本上,这里是一个数据样本:
INSERT INTO `users` VALUES ('john','john@gmail.com','\0'),('kate','kate@yahoo.com','\0'),
INSERT INTO `users` VALUES ('peter','peter@gmail.com','\0'),
当前结果:
INSERT INTO `users` VALUES ('john','-**5196869426929071700**@example.com','\0'),('kate','-**5196869426929071700**@example.com','\0'),
INSERT INTO `users` VALUES ('peter','-4574418619379266923@example.com','\0'),
所需输出:
INSERT INTO `users` VALUES ('john','-**5196869426929071700**@example.com','\0'),('kate','-**7140769694376981046**@example.com','\0'),
INSERT INTO `users` VALUES ('peter','-4574418619379266923@example.com','\0'),
我的代码:
import re
with open("dump.sql", "r") as file:
lines = file.readlines()
def repl(match):
output = str(hash(line)) + "@example.com"
return output
new_lines = []
for line in lines:
new_lines.append(re.sub('([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})', repl, line))
with open("dump-processed.sql", "w") as file:
file.writelines(new_lines)
任何关于这个问题的想法真的很感激,提前感谢!
2条答案
按热度按时间klsxnrf11#
在创建转储和有人看到混淆的电子邮件之间会发生什么?
这里有一个想法:
1.去拉屎
1.将转储装载到单独的表(或数据库,甚至服务器)中
1.将该表移动到其最终位置。
目标是什么?
如果电子邮件列需要在表之间保持一致,并且相同的电子邮件在不同行中显示为相同的散列,则可以实现这一点。
例如,'john@gmail.com'始终唯一地转换为'1f 9d 9a 9 efc 2f 523 b2 f09629444632 b5 c'。
如果您需要分别查看名称和域,我的方法需要一些工作。但您的“www.example.com“也是example.com如此。
ia2d9nvy2#
您可以使用
mysqldump --tab
来转储CSV数据文件,而不是SQL。然后对CSV数据进行混淆。导入这些文件稍微复杂一些。您需要重新创建这些表,然后一次使用
mysqlimport
创建一个表。您需要编写一些脚本来循环访问这些表,但是这样做的好处是导入比通过运行SQL文件导入要快得多。