Baru-baru ini semasa mengusahakan Arkib, saya mendapati diri saya perlu menyemak rekod DNS domain.
Archival Pro membolehkan pengguna menunjuk domain tersuai di tapak Arkib. Untuk mendayakan https untuk tapak ini, kami menggunakan pengesah domain berasaskan rekod TXT untuk mengesahkan pemilikan sebelum mengeluarkan SSL. Untuk menjadikan proses ini lebih mudah, saya perlu menanyakan rekod untuk menyemak sama ada rekod CNAME dan TXT dikonfigurasikan dengan betul dan menunjukkan beberapa mesej berguna jika tidak.
Dalam persekitaran seperti node.js atau C ini agak mudah, kerana setiap OS mempunyai cache DNS setempat dan alat carian. Walau bagaimanapun, saya menjalankan ini dalam pekerja cloudflare, yang sebenarnya merupakan pengasing v8 dan oleh itu tidak mempunyai akses kepada sistem dns OS. Malah, walaupun dengan nodejs_compat dihidupkan, perpustakaan dns daripada stdlib node hanya akan mengembalikan objek kosong.
Setelah melakukan sedikit penyelidikan, saya menyedari bahawa DNS-over-HTTPS moden akan sesuai untuk masalah ini, dan mempunyai kegunaan di luar kes sempit saya. Walau bagaimanapun, saya tidak menyukai mana-mana perpustakaan di npm untuk kes penggunaan ini - apa yang saya mahukan ialah sesuatu yang lebih serupa dengan pustaka DNS nod, yang menghilangkan pelayan carian.
Cloudflare menawarkan penyelesaian DNS-over-HTTPs, yang boleh anda baca di sini: https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/
Kelemahan utama API ini ialah ia boleh menjadi agak legap kepada pengguna biasa - kod status dikembalikan sebagai nombor yang dipetakan kepada spesifikasi, dan format respons adalah dalam format Soalan dan Jawapan serta termasuk data berbutir yang, walaupun berguna, tetapi berlebihan untuk kegunaan kasual.
Untuk memudahkan saya dan orang lain, saya menerbitkan cf-doh.
Ini ialah perpustakaan ringkas yang menjadikannya sangat mudah untuk menanyakan rekod daripada penyemak imbas, pekerja cloudflare atau mana-mana tempat lain yang dijalankan javascript. Ia bergantung pada pelaksanaan pengambilan asli, dan membenarkan menetapkan satu jika anda belum mempunyai satu, jadi jika anda mahu, anda juga boleh menjalankan dalam nod dengan pelaksanaan pengambilan whatwg yang diisi poli - namun jika anda berada dalam nod, anda juga akan mempunyai node:dns yang berkemungkinan seperti yang anda mahukan.
Selain membungkus panggilan ambil, pustaka ini menyediakan jenis penuh untuk keseluruhan spesifikasi, mengendalikan respons rentetan yang dipetik dan menukar ralat http dan respons status kepada pengecualian.
Penggunaan adalah mudah:
import { queryDNS } from "cf-doh"; const records = await queryDNS("_verification.jesseditson.com", "TXT"); records.forEach((r) => console.log(r));
Jika anda lebih suka nilai yang ditaip, anda juga boleh mengimport semua jenis rekod yang sah dan menggunakannya dan bukannya rentetan:
import { queryDNS, DNSRecordType } from "cf-doh"; const records = await queryDNS("_verification.jesseditson.com", DNSRecordType.TXT);
Jika anda ingin mengendalikan status selain daripada NoError, anda boleh menggunakan API peringkat rendah:
import { queryDNSRecords, DNSRecordType, DOHStatus, DOHStatusMessage } from "cf-doh"; const response = await queryDNSRecords("_verification.jesseditson.com", DNSRecordType.TXT); switch (response.status) { case DOHStatus.NoError: console.log("This record exists!"); break; case DOHStatus.NXDomain: console.log("Domain wasn't found"); break; default: console.log(DOHStatusMessage[response.status]); break; }
Untuk menambahkan ini pada projek anda, cuma jalankan npm install --save cf-doh. Jika anda ingin tahu tentang sumber atau permukaan API penuh, lihat repo:
https://github.com/jesseditson/cf-doh
Atas ialah kandungan terperinci cf-doh: cari rekod DNS daripada javascript frontend anda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!