在社交网络和即时通讯工具上发垃圾邮件是一种痛苦。 诚实的用户和开发人员都会感到痛苦。 米哈伊尔·奥夫钦尼科夫(Mikhail Ovchinnikov)在Highload ++(当时是本报告的文字版本)上说,他们如何在Badoo中与之抗争。
关于发言人: Mikhail Ovchinnikov一直在Badoo工作,在过去五年中一直从事反垃圾邮件工作。
Badoo拥有3.9亿注册用户(2017年10月数据)。 如果将服务受众的规模与俄罗斯人口进行比较,可以说,根据统计数字,每1亿人受到50万警察的保护,而在Badoo,只有一位反垃圾邮件员工可以保护每1亿用户免受垃圾邮件的侵害。 但是,即使是如此少量的程序员也可以保护用户免受Internet上的各种麻烦。
我们的受众群体很大,并且可以有不同的用户:
- 很好,我们最喜欢的付费客户;
- 相反,坏人是那些试图从我们那里赚钱的人:他们发送垃圾邮件,骗钱并进行欺诈。
谁必须打架
垃圾邮件可能有所不同,通常无法与普通用户的行为区分开。 它可以是手动的也可以是自动的-从事自动邮寄的机器人也希望与我们联系。
也许您也曾经写过机器人-正在创建用于自动发布的脚本。 如果您现在就这样做,最好不要再读了-绝对不要弄明白我现在要告诉您什么。
当然,这是个玩笑。 本文将不会提供可简化垃圾邮件发送者生活的信息。

那么我们必须和谁战斗呢? 这些是垃圾邮件发送者和骗子。
垃圾邮件是从互联网发展之初就出现的很久以前。 通常,在我们的服务中,垃圾邮件发送者会尝试通过在
该处上传一个
有魅力的女孩的
照片来注册一个帐户。 他们以最简单的形式开始发送最明显的垃圾邮件类型-链接。
一个更复杂的选择是,当人们不发送任何明确信息,不发送任何链接,不做任何广告,但
将用户引诱到更方便的地方时,例如即时通讯工具 :Skype,Viber,WhatsApp。 他们可以在不受我们控制的情况下向用户出售任何东西,进行促销等。
但是
垃圾邮件发送者不是最大的问题 。 它们很明显并且容易战斗。
骗子会假装成另一个人,然后尝试以互联网上的所有方式欺骗用户,从而使
骗子变得更加复杂和有趣。
当然,垃圾邮件发送者和诈骗者的行为并不总是与有时也这样做的普通用户的行为有很大不同。 在这两种形式中都有许多形式上的标志,不允许在它们之间划清界限。 这几乎是不可能的。
中生代如何处理垃圾邮件
- 可以做的最简单的事情是为每种垃圾邮件类型编写单独的正则表达式,然后将每个不良词和每个单独的域输入该正则表达式 。 所有这些都是手动完成的,当然,这是最不方便且效率最低的。
- 您可以手动找到可疑的IP地址,并将其输入到服务器配置中,这样可疑用户将永远不会再访问您的资源。 这是低效的,因为IP地址会不断地重新分配,重新分配。
- 为每种垃圾邮件发送者或漫游器编写一次性脚本,抓取日志,手动查找模式。 如果垃圾邮件发送者的行为发生了一些变化,则一切都会停止工作-也会完全无效。

首先,我将向您展示打击垃圾邮件的最简单方法,每个人都可以自己实施。 然后,我将详细介绍您使用机器学习和其他重型火炮开发的更复杂的系统。
处理垃圾邮件的最简单方法
手动审核
在任何服务中,您都可以聘请主持人,他们将手动查看用户的内容和个人资料,并决定如何处理该用户。 通常,此过程看起来像在大海捞针中找针。 我们拥有大量的用户,主持人较少。

除了主持人显然需要大量资源外,您还需要大量基础结构。 但是,实际上,最困难的事情是另一个-出现了一个问题:相反,如何保护用户免受主持人的侵害。
有必要确保主持人无法访问个人数据。 这很重要,因为主持人理论上也可以尝试造成伤害。 也就是说,我们需要将反垃圾邮件用于反垃圾邮件,以便主持人受到严格控制。
显然,您不能以这种方式验证所有用户。 尽管如此,
在任何情况下都必须进行节制 ,因为将来的任何系统都需要训练和人的手来决定如何处理用户。
统计资料收集
您可以尝试使用统计信息-为每个用户收集各种参数。

用户Innokenty从其IP地址登录。 我们要做的第一件事是登录输入的IP地址。 接下来,我们在所有IP地址和所有用户之间建立一个正向和反向索引,以便您可以获得特定用户登录的所有IP地址以及从特定IP地址登录的所有用户。
通过这种方式,我们获得了属性和用户之间的联系。 可能有很多这样的属性。 我们不仅可以收集有关IP地址的信息,还可以收集照片,用户来自其中的设备的信息-有关我们可以确定的所有信息。

我们收集此类统计数据并将其与用户相关联。 对于每个属性,我们都可以收集详细的计数器。
我们有一个手动审核机制,可确定哪个用户是好用户,哪个是坏用户,并在某个时候将该用户屏蔽或识别为正常用户。 我们可以分别获取每个属性的数据,总用户数,阻止的用户数和正常的用户数。
拥有每个属性的此类统计信息,我们可以大致确定垃圾邮件发送者是谁,谁不是。

假设我们有两个IP地址,一个是80%的垃圾邮件发送者,另一个是1%。 显然,第一个是垃圾邮件,您需要对此采取一些措施并采取某种制裁措施。
最简单的事情是编写
启发式规则 。 例如,如果阻止的用户超过80%,而被认为正常的用户-少于5%,则此IP地址被认为是错误的。 然后,我们禁止所有具有此IP地址的用户或对其进行其他操作。
从文本中收集统计数据
除了用户拥有的明显属性外,您还可以进行文本分析。 您可以自动分析用户消息,将与垃圾邮件相关的所有信息与它们隔离开:提及Messenger,电话,电子邮件,链接,域等,并从中收集完全相同的统计信息。

例如,如果一个域名是由100个用户在邮件中发送的,其中50个被阻止,则该域名是错误的。 可以将其列入黑名单。
基于消息文本,我们将为每个用户收到大量其他统计信息。 不需要机器学习。
停用词
除了显而易见的东西(电话和链接)之外,您还可以从文本中提取短语或单词,这对于垃圾邮件制造者来说尤其常见。 您可以手动维护停用词列表。
例如,在垃圾邮件发送者和诈骗者的账户上,经常会发现短语:“有很多假货”。 他们写道,一般来说,他们是唯一的认真对待其他伪造品的人,这些伪造品在任何情况下都不能被信任。
根据统计数据,在约会网站上,垃圾邮件发送者使用的短语比普通人更多:“我正在寻找一种认真的关系”。 普通人不太可能在约会网站上写这封信-很有可能是70%的垃圾邮件发送者试图诱骗某人。
搜索类似的帐户
利用统计信息和文本中的停用词,您可以构建一个系统来搜索相似的帐户。 查找和禁止同一人创建的所有帐户是必要的。 被阻止的垃圾邮件发送者可以立即注册一个新帐户。
例如,用户Harold登录,登录到该站点并提供其相当独特的属性:IP地址,照片,他使用的停用词。 也许他甚至使用了虚假的Facebook帐户注册。

我们可以找到所有与他相似且具有一个或多个这些属性匹配的用户。 当我们确定使用正向和反向索引已连接了这些用户时,我们将找到所有用户的属性,并根据这些属性对它们进行排名。 如果,例如第一个哈罗德,我们封锁了,那么其他人也很容易使用该系统“杀死”。
我刚才描述的所有方法都很简单:收集统计信息很容易,然后使用这些属性搜索用户很容易。 但是,尽管很容易,但借助诸如简单的审核,简单的统计数据和简单的停用词之类的简单操作,它们还是成功
地击败了50%的垃圾邮件 。
在我们公司中,前六个月的工作是,反垃圾邮件部门击败了50%的垃圾邮件。 如您所知,剩下的50%要复杂得多。
如何使垃圾邮件发送者生活困难
垃圾邮件制造者正在发明一些东西,试图使我们的生活复杂化,并且我们正在与之抗争。 这是一场无休止的战争。 它们比我们多得多,并且在每一步中,我们都提出了自己的多路径。
我敢肯定,在某个垃圾邮件发送者会议上,演讲者会谈到他们如何击败Badoo Antispam,他们的KPI或如何使用最新技术构建可扩展的容错垃圾邮件。
不幸的是,我们没有被邀请参加这样的会议。
但是,我们会让垃圾邮件发送者的生活变得困难。 例如,您可以使用所谓的“
隐形禁止 ”来代替向用户直接显示“您已被锁定”窗口,这是在我们不告诉用户被禁止的情况下。 他甚至都不应该怀疑。

用户进入沙箱(Silent Hill),那里的一切似乎都是真实的:您可以发送消息,投票,但实际上,这一切都变得虚无,如雾。 没有人会看到和听到,也没有人会收到他的信息和投票。
我们有一个案例,一个垃圾邮件发送者长时间发送垃圾邮件,宣传他的不良商品和服务,六个月后决定按预期使用该服务。 他注册了自己的真实帐户:真实照片,姓名等。 自然,我们的类似帐户搜索引擎很快就发现了这种情况,并将其列入了Stealth禁令。 在那之后,他在空白中写了六个月的书,说他很孤独,没有人回答。 通常,他将自己的全部精力倾倒在寂静岭的雾中,但没有得到任何答复。
垃圾邮件发送者当然不是傻瓜。 他们正在尝试以某种方式确定自己已进入沙盒,并且已被阻止,退出旧帐户并找到一个新帐户。 有时我们甚至想到将这些垃圾邮件发送者中的几个一起发送到沙箱,这样一来,他们就可以互相出售他们想要的一切,并按照自己的喜好进行娱乐。 但是,尽管我们尚未达到这一点,但我们正在设计其他方法,例如照片和电话验证。

如您所知,对于不是机器人的垃圾邮件发送者而言,很难通过电话或照片通过验证。
在我们的示例中,通过照片进行的验证如下所示:要求用户以特定手势拍摄照片,然后将生成的照片与配置文件中已加载的照片进行比较。 如果面孔相同,则该人很可能是真实的,上传了他的真实照片,可以留出一段时间。
垃圾邮件发送者很难通过此测试。 我们甚至在公司内部有一个名为Guess Who the Spammer的小型游戏。 给定四张照片,您需要了解其中哪些是垃圾邮件发送者。

乍看之下,这些女孩看上去完全没有伤害,但是一旦他们开始进行照片验证,就可以很清楚地看出其中的一个完全不是她声称的那样。
无论如何,垃圾邮件发送者很难与照片验证进行斗争。 他们真的很痛苦,试图以某种方式解决它,欺骗并展示他们所有的photoshop技能。

垃圾邮件发送者正在尽其所能,有时他们可能认为,这一切都是由某些令人难以置信的现代技术完全处理的,这些现代技术的构造很差,很容易被愚弄。
他们不知道主持人随后会再次手动检查每张照片。
没时间
实际上,尽管我们提出了各种使垃圾邮件发送者生活变得困难的方法,但是通常没有足够的时间,因为反垃圾邮件应该立即起作用。 在开始进行负面活动之前,他必须找到并消除用户。
最好的办法是在注册阶段确定用户不是很好。 例如,这可以使用群集来完成。
用户集群
注册后我们将立即收集所有可能的信息。 我们仍然没有用户登录所使用的任何设备,也没有照片,也没有统计信息。 我们没有什么可寄给他核实的,他没有做任何可疑的事情。 但是我们已经有了主要信息:
- 性别
- 年龄
- 注册国家;
- 国家和知识产权提供者;
- 电子邮件域
- 电话接线员(如果有);
- 来自fb的数据(如果有的话)-他有多少朋友,他上传了多少照片,在那儿注册了多久等等。
所有这些信息都可以用来定位用户集群。 我们使用简单且流行的
K-means聚类算法。 它在任何地方都可以完美实现,任何MachineLearning库都支持它,它是完全并行的,并且可以快速运行。 此算法有多种流版本,可让您动态地在群集上分发用户。 即使从我们的数量来看,所有这些工作都非常迅速。
收到了此类用户组(集群)后,我们可以执行任何操作。 如果用户非常相似(集群高度连接),则很可能是批量注册,必须立即停止它。 用户还没有时间做任何事情,只需单击“注册”按钮-就是这样,他已经进入了沙箱。
可以收集有关群集的统计信息-如果阻止了群集的50%,则可以将剩余的50%发送给进行验证,或者手动对所有群集进行审核,查看它们重合的属性并做出决定。 基于此类数据,分析人员可以识别模式。
模式
模式是我们立即知道的最简单的用户属性集。 实际上,某些模式对某些类型的垃圾邮件发送者非常有效。
例如,考虑三个完全独立,相当普遍的属性的组合:
- 用户在美国注册;
- 它的提供商是Privax LTD(VPN运营商);
- 电子邮件域:[mail.ru,list.ru,bk.ru,inbox.ru]。
这三个属性看似分别代表了自己,什么都不代表,这一起使它很可能是垃圾邮件发送者,几乎占90%。
您可以为每种垃圾邮件发送者提取任意数量的此类模式。 与手动查看所有帐户甚至群集相比,这更加高效且容易。
文字聚类
除了按属性对用户进行聚类之外,您还可以查找编写相同文本的用户。 当然,这不是那么简单。 事实是,我们的服务可以使用多种语言。 此外,用户经常使用缩写,语来书写,有时甚至会出错。 消息本身通常很短,实际上是3-4个字(约25个字符)。
因此,如果我们想在用户编写的数十亿条消息中找到相似的文本,则需要提出一些不寻常的内容。 如果您尝试使用基于形态分析和语言的真实诚实处理的经典方法,那么在所有这些限制,语,首字母缩写词和一堆语言的限制下,这将非常困难。
您可以做得更简单-应用
n-gram算法。 出现的每个消息都分解为n克。 如果n = 2,则这些是双字母(成对的字母)。 逐渐地,整个消息被分成几对字母并收集统计信息,每个二元组在文本中出现了多少次。

您不能止步于二元组,而可以添加三字组,跳字组(1、2等字母后的字母的统计信息)。 我们获得的信息越多越好。 但是,甚至二元组也已经很好地工作了。
然后,我们从每个消息的二元组中获得一个向量,该向量的长度等于字母长度的平方。
使用此向量并将其聚类非常方便,因为:
- 由数字组成;
- 压缩,没有空隙;
- 始终固定大小。
- 具有固定大小的此类压缩向量的k均值算法非常快。 我们数十亿条消息实际上是在几分钟内聚集在一起的。
但这还不是全部。 不幸的是,如果我们仅收集频率与二元组相似的所有消息,我们会得到与二元组相似的消息。 然而,它们实际上不必至少在含义上相似。 通常,长文本中的向量非常接近,几乎相同,但是文本本身却完全不同。 而且,从一定长度的文本开始,这种聚类方法通常会停止工作,因为 二元组的频率相等。

因此,您需要添加过滤。 由于群集已经存在,因此它们很小,我们可以使用词干或词袋轻松在群集内进行过滤。 在一个小型集群中,您可以从字面上比较所有消息,并获得一个保证有相同消息的集群,这不仅在统计上而且在实际中都一致。
, — , , ( ) . , - .
— VPN, TOR, Proxy, . , , , .
, , « IP».

VPN — , IP- , IP- VPN, Proxy .
:
- ISP (Internet Service Provider), IP- . , .
- Whois . IP- Whois : ; ; , IP-; , IP- .. , IP-.
- GeolP. , IP- , , IP- , , , IP- - .
- — IP- , GeolP, Whois, .
, , , IP- VPN .

, — , , .., , IP- VPN.
, . , advanced-, 100% . .
, IP- VPN, , IP- . , , . SOCKS-proxy, IP- .
, , ,
p0f . , fingerprinting , : , VPN-, Proxy .. , .
, , , , , : ? — ! , , , .
— ? . 2 , .
, , , , , , , .

, , ?
«User Decency»
— , .
«» :
.
. , , , .
, , «
». , , , , . .
1, , , , — .

.
False positive
, — . , IP-. , -, . , fingerprint, , , — , , , , - .
: : «, — Pornhub — ?» , - , .
. , , , .
- «Pornhub». - , - .

- -, .
, , . : , , , , .. , «» . , , , . , , .
, .
-
— MachineLearning, , 0 1 — .

, ,
, . , , . , - , .
, — . — , .
, ( ) , , . , , , : , , . .
HighLoad++ 2018 , , :
- ML- ,
- NVIDIA , .
- use case .
youtube- , — , .