Како осигурати своје ВебСоцкет везе

Интернет расте великом брзином. Све више и више веб апликација су динамичне, обузимају и не захтевају освежавање крајњег корисника. Појављује се подршка за комуникационе технологије са малим кашњењем попут веб-утичница. Веб-утичнице нам омогућавају да остваримо комуникацију у реалном времену између различитих клијената повезаних на сервер.

Многи људи нису свесни како да заштите своје веб странице од неких врло честих напада. Дозволите нам да видимо шта су они и шта треба да урадите да заштитите своје веб утичнице.

# 0: Омогућите ЦОРС

ВебСоцкет не долази са уграђеним ЦОРС-ом. То је речено, значи да се било која веб локација може повезати на било коју веб страницу вебсоцкет везу и комуницирати без икаквих ограничења! Нећу Originулазити у разлоге зашто је то тако, али брзо решење овог проблема је верификација заглавља на руковању вебсоцкет-ом.

Наравно, нападач може лажирати Оригин заглавље, али није важно, јер да би га искористио, нападач мора да лажира Оригин заглавље у прегледачу жртве, а модерни прегледачи не дозвољавају нормалном јавасцрипту који седи у веб прегледачима да мења Оригин хеадер .

Штавише, ако заиста аутентификујете кориснике користећи, пожељно, колачиће, онда вам ово заправо није проблем (више о томе у тачки # 4)

# 1: Примените ограничење брзине

Ограничење брзине је важно. Без тога, клијенти могу свесно или не знајући да изврше ДоС напад на вашем серверу. ДоС означава одбијање услуге. ДоС значи да један клијент одржава сервер толико заузет да сервер није у могућности да обрађује друге клијенте.

У већини случајева то је намерни покушај нападача да сруши сервер. Понекад лоше имплементације интерфејса такође могу довести до ДоС-а од стране нормалних клијената.

Користићемо цурећи алгоритам сегмента (који је очигледно врло уобичајен алгоритам за примену мрежа) за примену ограничења брзине на нашим веб утичницама.

Идеја је да имате канту која на свом поду има рупу фиксне величине. У њега почнете да стављате воду и она излази кроз рупу на дну. Ако је ваша стопа убацивања воде у канту дуже од брзине истјецања из рупе, у једном тренутку ће канта постати пуна и почети цурити. То је све.

Хајде сада да разумемо како је то повезано са нашом веб-утичницом:

  1. Вода је веб саобраћај који корисник шаље.
  2. Вода пролази низ рупу. То значи да је сервер успешно обрадио тај одређени захтев за веб-соцкет.
  3. Вода која је још увек у канти и није се излила у основи чека саобраћај. Сервер ће касније обрадити овај саобраћај. Ово би такође могао бити брз промет (тј. Превише промета за врло кратко време је у реду све док канта не цури)
  4. Вода која се прелива је промет који сервер одбацује (превише промета долази од једног корисника)

Поента је у томе што морате да проверите своју активност на вебсоцкет-у и одредите ове бројеве. Сваком кориснику ћете доделити ведро. Одлучујемо колики би требао бити сегмент (саобраћај који би један корисник могао послати током одређеног периода) у зависности од тога колико је велика рупа (колико времена просечно треба вашем серверу за обраду једног захтева за веб-утичницу, рецимо чување послате поруке од стране корисника у базу података).

Ово је скраћена имплементација коју користим на цодедамн за примену цурећег алгоритма сегмента за веб-утичнице. Постоји у НодеЈС-у, али концепт остаје исти.

if(this.limitCounter >= Socket.limit) { if(this.burstCounter >= Socket.burst) { return 'Bucket is leaking' } ++this.burstCounter return setTimeout(() => { this.verify(callingMethod, ...args) setTimeout(_ => --this.burstCounter, Socket.burstTime) }, Socket.burstDelay) } ++this.limitCounter

Па, шта се овде дешава? У основи, ако се пређе ограничење као и ограничење рафала (које су постављене константе), веза са веб-соцкетом пада. У супротном, после одређеног кашњења, ресетоваћемо бројач рафала. Ово опет оставља простор за још један рафал.

# 2: Ограничите величину корисног терета

Ово би требало да буде имплементирано као функција у вашој библиотеци вебсоцкет на страни сервера. Ако не, време је да га промените у бољи! Требали бисте ограничити максималну дужину поруке која би могла бити послата преко ваше веб странице. Теоретски нема ограничења. Наравно, добијање огромног корисног терета врло је вероватно да ће окачити ту одређену инстанцу сокета и појести више системских ресурса него што је потребно.

На пример, ако користите ВС библиотеку за Ноде за креирање веб-утичница на серверу, можете да користите опцију макПаилоад да одредите максималну величину корисног терета у бајтовима. Ако је величина корисног терета већа од те, библиотека ће изворно прекинути везу.

Не покушавајте то сами да примените одређивањем дужине поруке. Не желимо прво читати целу поруку у системску РАМ меморију. Ако је чак 1 бајт већи од постављеног ограничења, испустите га. То би могла да примени само библиотека (која обрађује поруке као ток бајтова, а не фиксне низове).

# 3: Створите чврст комуникацијски протокол

Будући да сте сада на дуплексној вези, можда ћете било шта послати серверу. Сервер може клијенту послати било који текст. Морали бисте да имате начин за ефикасну комуникацију између обоје.

Не можете да шаљете необрађене поруке ако желите да прилагодите аспект размене порука на својој веб локацији. Више волим да користим ЈСОН, али постоје и други оптимизовани начини за подешавање комуникације. Међутим, с обзиром на ЈСОН, ево како би изгледала основна шема за поруке за генеричку веб локацију:

Client to Server (or vice versa):  status: "ok"

Сада вам је лакше на серверу да проверите да ли постоје валидни догађаји и формат. Одмах прекините везу и забележите ИП адресу корисника ако се формат поруке разликује. Нема шансе да се формат промени уколико неко ручно не зајебава вашу везу са веб мрежом. Ако сте на чвору, препоручујем употребу Јои библиотеке за даљу проверу долазних података од корисника.

# 4: Потврдите идентитет корисника пре успостављања ВС везе

Ако користите веб-утичнице за оверене кориснике, прилично је добра идеја омогућити само потврђеним корисницима да успоставе успешну везу са Веб-утичницом. Не дозволите никоме да успостави везу, а затим сачекајте да се потврди идентитет преко саме веб странице. Пре свега, успостављање вебсоцкет везе је ионако мало скупо. Дакле, не желите да вам неовлашћени људи скачу на веб-утичницама и повезују везе које би могли да користе други људи.

Да бисте то урадили, када успостављате везу на интерфејсу, проследите неке податке за потврду идентитета у веб-соцкет. То би могло бити заглавље попут Кс-Аутх-Токен:. Подразумевано, колачићи би се ионако прослеђивали.

Опет, то се заиста своди на библиотеку коју користите на серверу за примену вебсокета. Али ако сте на Ноде-у и користите ВС, постоји ова верифиЦлиент функција која вам омогућава приступ информационом објекту прослеђеном на вебсоцкет везу. (Баш као што имате приступ рек објекту за ХТТП захтеве.)

# 5: Користите ССЛ преко веб сокета

Ово није нимало паметно, али још увек треба рећи. Користите всс: // уместо вс: //. Ово додаје безбедносни слој вашој комуникацији. Користите сервер попут Нгинк-а за обрнуто проксирање веб-сокета и омогућите ССЛ преко њих. Постављање Нгинка било би сасвим друго упутство. Директиву коју требате користити за Нгинк оставићу онима који су је упознати. Више информација овде.

location /your-websocket-location/ { proxy_pass ​//127.0.0.1:1337; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; }

Овде се претпоставља да ваш вебсоцкет сервер преслушава на порту 1337 и да се ваши корисници повезују са вашом вебсоцкет на овај начин:

const ws = new WebSocket('wss://yoursite.com/your-websocket-location')

Питања?

Имате питања или сугестије? Питајте!