基于tshark在原生php上實(shí)現(xiàn)ja3
他有什么用? 使用ja3來(lái)驗(yàn)證是否用戶是爬蟲(chóng),在傳統(tǒng)的方案中,通?;谧R(shí)別header來(lái)判斷用戶是機(jī)器人,但是這種方法極有可能被偽造header而誤判,有時(shí)候管理員可能不希望某一個(gè)用戶來(lái)訪問(wèn),所以拉黑IP,但是如果他使用代理IP或者重啟光貓,那么他又可以繼續(xù)訪問(wèn)了,在現(xiàn)在絕大部分網(wǎng)站是支持ssl,所以我們可以通過(guò)tls指紋來(lái)判斷用戶是否是機(jī)器人。 例如:requests、httpx以及CURL,無(wú)論如何偽造信息他們的指紋都是相同的,所以管理員只需要記住他們的指紋,那么下一次遇到相同指紋時(shí),就可以進(jìn)行攔截。 項(xiàng)目原理 該項(xiàng)目基于php-ja3的原生移植,項(xiàng)目地址:php-ja3,在這個(gè)項(xiàng)目中,他使用的tshark進(jìn)行數(shù)據(jù)包攔截,獲取到j(luò)a3后通過(guò)DataShare進(jìn)行數(shù)據(jù)傳輸,但是,在實(shí)際業(yè)務(wù)環(huán)境中,我們可能不會(huì)去使用workman,為了使用這個(gè)功能需要再安裝一個(gè)workman,所以我移植到原生php中。 由于DataShare只能使用workman,所以在該項(xiàng)目移植中,我使用Redis來(lái)交互數(shù)據(jù)。 如何使用? 1、下載phpja3.zip 2、配置main.php中相關(guān)配置 12行配置tshark路徑,通常情況下,如果你將wireshark安裝到C盤(pán)下,就不需要該操作,該項(xiàng)缺省值為 $tshark = 'C:\\PROGRA~1\\Wireshark\\tshark.exe';
24行配置redis信息,該項(xiàng)缺省值為redis默認(rèn)端口和本地 $redis->
connect
(
'127.0.0.1'
,
6379
);
31行配置業(yè)務(wù)網(wǎng)卡,填寫(xiě)網(wǎng)卡名稱,該項(xiàng)缺省值為本地回環(huán)網(wǎng)卡
define(
"NETWORK_INTERFACE"
,
"Adapter for loopback traffic capture"
);
3、配置完成后直接啟動(dòng)該文件 php main.php 啟動(dòng)成功后應(yīng)該是如下這樣的
PS
D:\important\desktop\php_ja3> php .\main.php
Capturing
on
'Adapter for loopback traffic capture'
** (tshark:
15056
)
04
:
19
:
48
.
346861
[Main MESSAGE] -- Capture started. ** (tshark:
15056
)
04
:
19
:
48
.
349348
[Main MESSAGE] -- File:
"C:\Users\Administrator\AppData\Local\Temp\wireshark_NPF_LoopbackLLNM81.pcapng"
4、配置你的業(yè)務(wù)環(huán)境 樣例代碼,從redis中獲取ja3信息
// usleep(50000);
sleep(
1
);
$redis
=
new
Redis();
$redis
->connect(
'127.0.0.1'
,
6379
);
$REMOTE_ADDR_PORT
=
$_SERVER
[
'REMOTE_PORT'
];
$ja3
=
'ja3_'
.
$REMOTE_ADDR_PORT
;
echo
$ja3
;
echo
$redis
->get(
$ja3
); 由于通過(guò)抓包嗅探,你需要延遲3000微秒以上第一次才會(huì)獲取成功,如果你對(duì)這方面沒(méi)有需求且沒(méi)有延遲,第一次獲取可能獲取為空。 驗(yàn)證:瀏覽器環(huán)境 我們可以獲取出用戶的指紋
驗(yàn)證:爬蟲(chóng) 第一次
第二次
無(wú)論我們?cè)趺醋儞Q模擬的header或其他請(qǐng)求信息,他的指紋都是相同的,我們只需要記錄這個(gè)指紋,那么就可以輕松檢測(cè)出爬蟲(chóng)。