铁穹是由web中间件研发组开发的一套以“设备指纹”技术为核心打造的人机对抗系统,可应用于反爬虫、登录、注册、领券、发送验证码、下单等需要做限制和风控对抗的一些场景。
铁穹支持同步防爬,移步:http://bps.17usoft.com/pages/viewpage.action?pageId=14697290
- 引用铁穹
JS SDK
,推荐加上版本号使用,方便升级时清除CDN
缓存。- 请加载在
jquery
之后,如未引用jquery
需添加引用。(如下段代码) ,也支持fish
和zepto
,fish
框架需要像下面示例代码,需手动增加二次验证函数.- 把需要保护的请求接口代码包含到
$.td(function () {/*原代码*/}, '/td/key', '/td/cookie')
有几处要包几处,建议把入口封装成一个入口函数,然后在入口处执行一下。
最好让$.td
只执行一次。- 找叶成/金正宝申请铁穹配置,沟通接入场景对应的阈值、规则限制。
上线一开始会使用监控模式即只记录日志,不进行拦截。在观察ok
之后,才会切换到拦截模式对恶意请求进行拦截。
// 2.请加载在`jquery`之后,如未引用`jquery`需添加引用。
<script type="text/javascript" src="//file.40017.cn/leonidbucket/tdjs/leonid-tq-jq-v3-min.js"></script>
- 引入SDK后,F12调试会被block住, 如果要调试脚本,请在
file.40017.cn
域名下,添加
cookie:document.cookie = "debug=nodebug"
- 访问https://file.40017.cn/leonidbucket/tdjs/nodebug.html?v=2 ,方便设置不调试
cookie
,注意http
和https
的cookie
不同. 加完cookie
之后, 再次访问受保护页面使用ctrl + f5
强刷一次.- 有一些铁穹出不来验证码的问题, 请看下图。
注: 仅限同程大厦
<!--Jquery可以用项目的-->
<script type="text/javascript" src="//file.40017.cn/tcweb/pc/public/js/common/jquery/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="//file.40017.cn/leonidbucket/tdjs/leonid-tq-jq-v3-min.js?20170913"></script>
<h2>铁穹Demo</h2>
<input type="button" onclick="UserLogin()" value="登录" />
<input type="button" onclick="UserLoginNative()" value="登录(非Jquery)" />
<script>
function UserLogin() {
//执行代码包到$.td(function () {/*原代码*/}, '/td/key', '/td/cookie')中。
$.td(function () {
var url = '/Demo/UserLogin';
var parms = {
UserName: '18605120000',
UserPwd: '456345234'
};
$.ajax({
url:url,
data:params,
success: function (data) {
alert('提示信息' + data);
}
});
}, '/td/key', '/td/cookie')
//备注:请注意移动端接入防爬虫需 /td/key 写为 /td/key/ua
}
</script>
<!--以下是非Jquery请求代码-->
<script type="text/javascript" src="//js.40017.cn/cn/min/??/cn/public/fish.1.5.1.js,/cn/public/fc.1.1.6.js?v=131225061"></script>
<script>
function UserLoginNative() {
//执行代码包到$.td(function () {/*原代码*/}, '/td/key', '/td/cookie')中。
$.td(function () {
var url = '/Demo/UserLogin';
var parms = {
UserName: '18605120000',
UserPwd: '456345234'
};
fish.ajax({
url: url, openType: "post", data: parms, fn: function (respBody) {
//非Jquery请求,需要在回调时用这个函数验证下
if (!window.leonidTqAjaxCallback(respBody)) {
console.log("铁穹未验证通过");
return;
}
alert("Native-" + respBody);
}
});
}, '/td/key', '/td/cookie', function(err){
//二次验证回调函数(仅在开启iframe二次验证功能有效), 可不传入此参数
//默认的二次验证回调函数如下
//用户可以在一些例如登录场景下,重写这个二次验证回调函数
//可以达到二次验证成功,模拟登录按钮再次点击,避免用户重复输入用户名和密码
if(err){
console.log(err);
}
location.href = location.href;
})
//备注:请注意移动端接入防爬虫需 /td/key 写为 /td/key/ua
}
</script>
铁穹判断请求有恶意之后,根据相应 的配置会
直接返回400响应码,对应请求不会转发给后端接口。
触发滑动验证码二次验证,如果恶意情况比较明显,会触发难度更高的文字点选验证码。
注意: 以下所有流程,需要在预发先演练一次,确认无误之后,再上线配置!!!
- 在狮子座上配置需要接入的应用域名 例如:接入域名为
www.ly.com
,接入路径为/hotel/roomprice
1.1. 在狮子座上配置www.ly.com
的/td/key
和/td/cap/valid
的配置 (可使用克隆
功能, 以防出错)
1.2. 在狮子座上配置tlb
中,对应/hotel/roomprice
路径的源服务器, 注意配置运维的upstream
名称需要和tlb
对应, 这样才能同步更新服务器信息, 规则为tlb-{tlb域名分组id}-{tlb里的upstream名称}
,例如:tlb-7-jpebook_ly_com
1.3. 在狮子座上配置/hotel/roomprice
路劲的配置信息, 服务器指向 1.2 步骤配置的服务器, 不开启防爬
1.4. 使用线上堡垒机, 发送命令curl -H "Host: www.ly.com" http://172.16.199.110:6102/hotel/roomprice
验证配置是否生效- 在
tlb
系统配置
2.1. 在tlb
中为域名www.ly.com
添加配置/td/
这个location
配置, 送到狮子座机器
2.2. 在tlb
中为域名www.ly.com
添加配置/hotel/roomprice
这个location
配置, 送到狮子座机器
2.3. 验证www.ly.com/hotel/roomprice
是否可以正常打开, 响应头中是否有狮子座特征响应头leonid-*
- 项目修改代码上线
3.1. 项目前端按上面的文档接入铁穹, 把代码包在$.td
里
3.2. 项目代码上线, 然后观察是否有异常,- 在狮子座后台配置中,开启铁穹防爬, 并调整参数, 观察是否有异常
- 上线完成
-- -9 getIpLevel 指纹 错误,放过
-- -8 getIpLevel ip地址 错误,放过
-- -7 表示获取key时,获取cookie对象失败
-- -6 获取正则跳转验证码地址错误
-- -5 系统出现异常,强制全部放过
-- -4 狮子座白名单,放过
-- -3 出错临时放过
-- -2 表示基础白名单或者系统出错了
-- -1 表示白名单
-- 2 跳转去验证码
-- 22 需要验证码认证,并且有验证码的cookie,但是cookie不正确,需要跳过去重新验证
-- 3 表示 redis ip 黑名单
-- 4 表示 redis fp 黑名单
-- 99 正常通过
-- 98 老的ip或者老的ua和新的ip和ua不匹配,但是使用noua匹配通过
-- 97 获取key接口,正确响应
-- 101 表示没有ua
-- 102 cookie检查错误
-- 104 没有deviceid
-- 105 两次deviceid深度检查都出错
-- 106 当前did被关紧闭了,关在了当前的sharedict中
-- 107 当前did被塞入了redis的黑名单中
-- 108 当前deviceid访问太过于频繁
-- 109 ua 命中黑名单
-- 110 referer 不存在
-- 111 referer 主机头不正确
-- 113 验证码 did 不匹配
-- 114 验证码 cookie ts 超时
-- 115 验证码 cookie 解密失败
-- 116 老的ip或者老的ua和新的ip和ua不匹配,但是使用同一个did请求
-- 117 did 解密出来的随机数不正确
-- 118 did 的随机数和 session 不匹配
-- 119 did 的随机数解密失败
-- 120 did 的上一次请求ip和指纹解密失败
-- 121 did 整体解密失败
-- 122 获取用户上次请求的真实IP失败
-- 123 获取用户的唯一设备指纹失败
-- 124 指纹识别失败指纹等于err错误的指纹
-- 130 获取 sessionkey cookie 失败
-- 131 session key cookie 没有
-- 132 session key cookie 不是有效的base64格式
-- 133 sessin key 签名验证失败
-- 134 session key 过期了
-- 135 session key 随机数无效
-- 141 请求key接口,没有s1加密串
-- 142 请求key接口,没有s2签名串
-- 143 请求key接口,没有fp指纹
-- 144 请求key接口,没有时间戳
-- 145 请求key接口,时间戳过期
-- 146 请求key接口,s1 解密失败
-- 147 请求key接口,缺少必要参数
-- 148 请求key接口,指纹伪造
-- 149 请求key接口,指纹签名对比失败
-- 150 请求key接口,本地httpLocalProxy,比如fiddler等
-- 201 lastKey出错或未找到,临时放过
-- 202 redis连接出错,临时放过
-- 203 redis lrange 操作出错,临时放过