Open budget. Csrf tokendan toki recaptchagacha...

Open budget. Csrf tokendan toki recaptchagacha...

@yetimdasturchi

Yaqin kunlarda O'zbekistonda top saytlar ro'xatida birinchilikga chiqqan openbudget.uz loyihasi haqida eshitmagan odam qolmadi menimcha.

Odamlar pepsi, energetik, shokolad yoki umuman olganda turli narsalar evaziga ovoz yig'ishmoda.

Lekin asosiy kontingentni telegram botlar egallab kelmoqda. Bunga asosiy sabablardan biri openbudget dasturchilari, dasturlash madaniyatining har qanday bosqichini buzishgani bo'lmoqda.

Ayni damda saytda so'rovlar himoyasi uchun csrf tokendan boshlab google recaptchagacha mavjud. Lekin bir biriga bog'langan himoya tizimlar nima uchundir zararga ishlamoqda.

Misol uchun csrf token sayt tomonidan generatsiya qilingani bilan formalarni yuborishda ishlatilmaydi. Ovoz berish jarayonida ham ip orqali cheklov o'rnatishgan, lekin ip manzillarni to'g'ridan to'g'ri headerdan olishmoqda. Raqam va loyiha idenfikatorini backend bilan solishtirish ham xuddi shunday tarzda ya'nikim ikkita string bir-biriga qo'shilib sha1 generatsiya qilinmoqda xolos.

Yaqin kunlarda qo'shilgan google recaptcha esa menimcha ko'pchilik uchun haqiqiy muammoga aylandi. Lekin bu tizimni o'zida ham dasturchilar katta qovun tushirib qo'yishgan.

Keling xavfsizlik qismlarini birma-bir ko'rib chiqsak:

CSRF:

Ishlatilmayapti

IP manzil orqali ma'lum davrga bloklash:

Bu jarayondan o'tish unchalik ham qiyin emas, shunchaki http so'rovlarda header uchun REMOTE_ADDR, HTTP_X_FORWARDED_FOR, HTTP_X_REAL_IP, X-Forwarded-For ma'lumotlarni tasodifiy ip generatsiya qilib yuborishning o'zi yetarli. Hattoki bu jarayon OTP olish vaqti va OTPni tasdiqlash uchun ishlatiladigan token uchun ham hisobga olinmagan (Error: 404, Mantiq not found)

Ovozlarni tasdiqlash uchun sha1 hash:

Api orqali raqam yuborish vaqtida e'tibor bergan bo'lsangiz key elementi ham massivga qo'shiladi. Aniq malumotga ega bo'lmasamda ular bu elementdan ovozlarni tashqari yoki ichkaridan kelayotganini aniqlab olish uchun ishlatishmoqda. Ya'nikim saytni o'zidan apiga murojaat qilinmaganmi demak soxta ovoz.

Ho'sh keyni qanday generate qilishmoqda:

Forma orqali ovoz berish uchun ikkita ma'lumot yuborish kerak deylik. Demak bular telefon raqam va loyiha idenfikatori bo'lmoqda.

{"phone":"+998 (90) 123-45-67","application":"123456"}

Bundan demak front qismni o'zida yuqoridagi ma'lumotlardan quyidagi string tuzilmoqda va sha1 hash tuzilmoqda:

phone:+998 (90) 123-45-67application:123456_9fbb07405880433e5b1fd3f44545eaad3bdddbb5

9fbb07405880433e5b1fd3f44545eaad3bdddbb5 - buyerda dasturchilar hash uchun kiritgan qo'shimcha himoya.

Google recaptcha:

Nu da... Google recaptcha ko'pchilik uchun katta mavzu. Hatto meni ham ko'p holatda o'ylantirib qo'ygan. Chunki ushbu tizimning vazifasini sizdan robot emasligingizni isbotlashni so'raydi. Albatta juda qiziq va murakkab jarayon.

Lekin velosipedni qayta ixtiro qilish shart emas. Saytni o'zidagi tayyor bloklardan ham foydalanib recaptcha tizimini chetlab o'tish mumkin.

Bu uchun shunchaki ovoz berish tugmasi->sms orqali ovoz berish bosiladi. Raqam kiritilatigan forma chiqdimi demak window obyektiga grecaptcha obyekti qo'shildi.

Davomiy ishda esa shu obyekt orqali yangi recaptcha kod generatsiya qilib olinaveriladi:

Quyidagi kodga qaraydigan bo'lsak ish prinsipi juda oson. grecaptcha obyekti uchun yangi bo'sh div elementi yaratiladi va recaptcha ishga tushiriladi. Shundan so'ng soket orqali backend qismga ulash lozim. Ya'ni backend qismdan soketga new deb xabar yozilganda front qismdan yangi recaptcha kalit uzatiladi. Ushbu kalit orqali esa bemalol yana avvalgidek so'rovlarni yuborish va sms kodni qabul qilib olish mumkin.

var rc_el = Math.floor(Math.random()*99999).toString();
var rc = document.createElement('div'); 
rc.setAttribute("id", rc_el);
document.body.appendChild(rc);

var host = 'ws://localhost:8095/sc.php';
var socket = new WebSocket(host);

widgetId = grecaptcha.render(rc_el, {
    'sitekey' : window.__NUXT__.config.recaptcha.siteKey,
    size: "invisible",
    'callback' : function(token) {
        socket.send(token);
    }, 
});

socket.onmessage = function(e) {
    if (e.data == 'new') {
        grecaptcha.execute(widgetId);
    }
}; 

-----------------------------------------------------------------------------------------------------------------

Aqlingizni charxlab ko'proq bilim oling. Asosiysi yechim topishga oshiqing. Debil dasturchilar faqat dasturlashni o'rganishadi, buyuk dasturchilar yechim topishni.

(c) - Yetim dasturchi

Telegram kanalga obuna bo'lishni unutmang: @yetimdasturchi

Report Page