跳至正文

行为层

程序暴露自己,靠的是怎么做,而不是做了什么

每一次访问都会产生动作:一个移向按钮的光标、被按下又抬起的按键、被滚动的页面、被触碰的屏幕。TRACIO 持续为这些动作打分,并告诉您它们出自一只手,还是出自软件。

我们观察什么

四路输入通道,按访问者手中的设备加权

每路通道先各自打分,然后再合并。权重不是固定的,它跟着访问者实际使用的设备走。在手机上,触摸主导判定,没有光标毫无意义;在桌面端,光标是最强的一路通道,而没有触摸数据流本来就是意料之中的事。

鼠标与光标

桌面端主力

速度及其波动幅度、每段行程中的方向变化次数、路径如何向目标弯曲、点击前的加速与制动,以及脚本化移动无法复现的人手细微颤抖。

键盘节奏

仅时序

每个键按下的时长、一次抬起到下一次按下之间的间隔、上一个键还没抬起下一个键就已按下的重叠、连打与停顿、修改与退格。只有时序,绝不涉及字符。详见下方的隐私部分。

滚动

两种形态皆适用

速度的波动、方向反转的频率、像真实轻扫那样衰减的惯性,以及与屏幕上实际文字量对得上的停顿。

触摸

移动端主力

接触面积及其在一次点按过程中的变化、设备愿意公开时的压力值、手指绝不会两次落在同一像素上的细微漂移,以及多个触点之间的时序关系。

同一次会话,两种加权方式

桌面端会话光标主导

鼠标和键盘承担权重。这里本就不期待触摸数据流,因此它的缺席不会让访问者付出任何代价。

手机端会话触摸主导

触摸和设备运动承担权重。完全没有光标移动的访问在手机上是正常的,而不是可疑的。

缺席不是证据

设备从未提供过的通道会被排除在评分之外,而不是记在访问者头上。这听上去理所当然,却正是幼稚的行为评分把真实客户变成嫌疑人的最常见方式:手机没有鼠标,使用读屏软件的人不会有平滑的光标轨迹,而这两件事都没有对“是不是机器人”说过任何话。

证据

软件做得到、手做不到的三件事

这些是例子而非完整规则集,但它们展示了我们据以行动的证据长什么样。每一条对人手来说都在物理上不可能,而且每一条都设有闸门,确保一个孤立的反常瞬间不会变成一次判定。

节拍器般的按键时长

我们测量什么

整段输入里,每个键按下的毫秒数几乎完全一致。

为什么人手做不到

手指停留在键上的时间,取决于是哪个键、属于哪只手、那只手有多疲劳。人的按键时长是分散的。注入的击键由一个常量生成,这种分散几乎坍缩为零。

什么保证它不出错

该规则要求窗口内有足够多的击键才会计入。四个字符的输入不是样本,也不会被当作样本来评分。

瞬移的点击

我们测量什么

点击落在光标从未经过的控件上——指针直接出现在坐标处并触发。

为什么人手做不到

人是逐渐接近目标的:路径向内弯曲,接近终点时速度下降,按下之前通常还有一个悬停的瞬间。自动化只是设定坐标并派发事件;因为物理上什么都没有移动,所以根本不存在“接近”这个过程。

什么保证它不出错

孤立的一次瞬移点击,完全可能是键盘操作或触控板留下的产物。只有在点击次数足以判断的会话里,它占到大多数时才会被计入。

向隐藏标签页输入

我们测量什么

页面处于后台且从未被切到前台,击键却仍在持续到达。

为什么人手做不到

人无法向自己没在看的页面输入。养号软件并行驱动几十个标签页,不会在开始填表前逐个把它们切到前台。

什么保证它不出错

标签页切换那一瞬间的单个事件,是浏览器事件之间的竞态,而不是证据。只有当页面始终未曾可见、输入却反复出现时才会计入。

隐私

我们测量的是节奏。我们无法还原文本。

行为采集在页面上的所有位置运行,包括密码、邮箱和卡号输入框。这是一个刻意的决定,理应完整解释清楚,而不是埋进政策文件里。

为什么恰恰是敏感输入框最重要

撞库、盗卡试卡和账户接管,全都发生在这些输入框内部。在那里自动关闭的检测器,等于在攻击真正发生的唯一位置上闭上了眼睛。此前的行为正是如此:敏感输入框中的采集被整体禁用,于是一次访问中风险最高的那几秒钟没有产生任何测量值。

我们保留什么

时序。某个键何时按下、按住了多久、到下一个键之间隔了多久、两次按下是否重叠。这足以把一只手和一台生成器区分开来,而这也是检测器一直以来所需要的全部。

我们不保留什么

那是哪一个键。在敏感输入框内,每一次击键的身份都会在浏览器中被替换成一个粗粒度的代理值,且发生在任何数据离开页面之前——替换成少数几个桶中的一个,而不是一个字符。没有反向对照表。到达我们服务器的数据流中不含文本、不含文本片段,也不含任何可以重新拼回文本的东西。

我们必须处理的连带后果

由于在这些输入框中按键身份确实已经消失,任何依赖区分按键的规则都必须把这些击键排除在自己的计数之外——否则一个正常的密码看起来就像同一个键被反复敲击,我们会因为用户输入得完全正确而把他们标记出来。基于时序的规则不受影响,仍在完整数据流上继续工作。

关闭采集从来没有保护过内容

两种设计下,字符本身都从未被采集。旧的一刀切排除去掉的只是证据——它让检测器变瞎,却没有让任何人更私密。代理值方案在对您文本的保证上分毫未变,同时把测量值还给了检测器。更强的检测和更好的隐私出自同一个决定,这种情况少见到值得明确说出来。

规则如何上线

新规则在被允许影响判定之前,先蒙着眼睛跑一段

检测一旦在没有证据的情况下自作聪明,就会立刻变糟。每一条行为规则都先以影子模式加入:它在真实生产流量上被评估、结果被记录,但对任何人看得见的评分都毫无贡献。

01

以影子模式上线

规则从第一天起就在真实流量上评估。它的输出只进入分析,不会因为新增了一条规则就让任何客户的判定发生变化。

02

在两个总体上分别测量

我们观察它在被独立判定为人类的会话上和被独立判定为自动化的会话上分别多久触发一次,观察量要大到足以说明问题。

03

由两个阈值决定

它必须至少做到十比一的区分度——在自动化上的触发频率至少是在真人上的十倍——并且在真实人类会话上的触发率必须保持在 0.5% 以下。

04

要么晋级,要么留在暗处

同时通过两道闸门的规则才能在评分中获得权重。没有通过的规则会留在影子模式,或者被直接移除。晋级是一次经过评审的、刻意的变更,没有任何东西会自动开启。

正是这套机制,让您不必担心一个一夜之间自作聪明的检测器开始把自家客户挡在门外。不会因为有人在某个周五下午冒出一个想法,您的误报率就发生变化。

您会收到什么

三个字段,随识别事件一同送达

行为判定与事件的其余部分一起到达:没有第二次调用,没有轮询,也没有另一个需要单独对接的端点。

字段取值范围含义
score0–100数值越高越接近人类。它是连续值而非分档,因此您可以按自己的风险偏好设定阈值,而不是照搬我们的。
verdicthuman · uncertain · bot把评分收敛成三种状态。“uncertain”是一个真实的答案,而不是一次失败:这次会话的输入太少,不足以判断,我们选择如实报告而不是猜测。
confidence0.0–1.0表示这次判定建立在多少观测到的输入之上。一次长时间填表的会话会以高置信度打分,两秒钟的跳出则不会——在您据此行动之前就能看到这一点。

事件片段

{
  "visitorId": "X7fh2Hg9LkMn3pQr",
  "behavior": {
    "score": 87.4,
    "verdict": "human",
    "confidence": 0.82
  }
}

Business 方案及以上可用。通过 Webhook 投递,也可经由 Data API 获取。

行为区块是一路信号,不是一个动作。它本身不拦截任何东西——请把它与事件的其余部分以及您自己的策略结合起来,决定权本就属于那里。

边界

行为不能告诉您什么

行为把一个问题回答得很好:是人还是程序。它回答不了“是哪一个人”,我们也不会按能回答的样子去卖它。

它不是身份信号

我们不宣称能凭输入习惯或鼠标动作认出一位回访的个体。我们在真实流量上做过测量:在同一个人使用的两个浏览器之间匹配这个具体的人,表现并不优于随机。任何兜售“可识别用户的行为生物识别”的厂商,都应该被要求公布同样的数字。

它不替代识别

这台设备是谁,来自设备与浏览器层。行为告诉您的是:驱动这台设备的是哪一类主体。两者回答的是不同的问题,谁也替代不了谁。

它需要输入才能工作

一位落地两秒就离开的访问者,几乎不会留下可供打分的东西。此时诚实的输出是带着低置信度的“uncertain”,而不是一个被打扮成判定的猜测。

常见问题

常见问题

在您自己的流量上看看行为判定

装上探针,看着评分随每一个识别事件到达,然后自己判断它值多少。