Prazan $_SERVER['HTTP_REFERER']
Problem: Sistem privatnih poruka. Na sajtu postoji formular, pisu poruku i kliknu na send. U scriptu koji cuva poruke u bazu stoji ovako nesto:
PHP kôd:
Medjutim, naizgled jednostavno resenje ima problem. Nekim clanovima je referer prazan. Znaci $_SERVER['HTTP_REFERER'] == "" Kako je to moguce? Razliciti su browseri u pitanju a korisnici su sve samo ne strucni da umeju da sakriju referer na neku foru. |
Mislim da je caka u firewall-ovima...
|
U prevodu ti imaš probleme sa CSRF?
E sad davno je bilo kad sam se zanimao time u php-u. U osnovi šalješ jedan skriveni parametar kroz forme/url/sesiju/kolačić čija vrednost je validna samo za taj zahtev. Da koristiš django, mogao bih ti preporučiti CsrfMiddleware - simple Cross Site Request Forgery protection :rolleyes: |
Meni se desilo da sam kod drugara naleteo na njegov FireFox koji je slucajno podesen da salje $_SERVER['HTTP_REFERER'] = 'HTTP_REFERER';
pa mi neke redirekcije nisu radile... :-( Znaci, ima i takvih slucajeva. |
Petre, hvala za link, medjutim to je definicija problema a ne rešenje :)
Što se tiče skrivenih parametara, ne znam kako si to mislio, da stavim neki "hidden"? To i nije zaštita, a $_SESSION, i $_COOKIE ostaje jer je on ulogovan. Kapiraš šta rade? Dođu na sajt i samo se uloguju. A onda sa svog servera šalju post zahteve na script koji šalje poruke i pošto su ulogovani ovamo, stoji im lepo i SESSION i COOKIE, tako da prođe bez problema. A to se iz javascripta relativno lako uradi... samo napraviš da fura neki array sa id-jevima članova i na load, šalje sledeći... nije neka nauka :) |
Prosta CAPTCHA? Znam da smara korisnike, ali ako im jasno naglasiš da je to tu da bi zaštiti njih od spam poruka mislim da će razumeti. 3 cifre je sasvim dovoljno u tvom slučaju IMO.
Što se referera tiče može da se blokira slanje istog jako lako. Čak većina alternativnih browser, pogotovo IE ljuski ima ugrađen "paranoid" mod (ime mu govori sve ;) ). I sam znaš kakvi su obični korisnici... Pročitaju u Mikru kojekakve priče i onda od mrava prave slonove ;) PS: Za one koji ne znaju šta je CAPTCHA. |
Mozes i sam da generises referer i da ga ubacis u promenljivu sesije.
Recimo na prvoj strani nesto tipa: PHP kôd:
PHP kôd:
Inace, ja bi umesto captche generisao neki hash baziran na username/pass kompbinaciji i ubacio ga u sesiju, a istu proverio na sledecoj strani. Na primer na strani sa koje si zeleo da uzmes referer: PHP kôd:
PHP kôd:
|
@bluesman: Nešto si rek'o :p
Citat:
Edit: Čisto da napomenem, ako neki nisu do sada shvatili: Za svaku formu koja menja stanje (aka state) na serveru se koristi dotična kombinacija - naravno tajni ključevi se menjaju za svaki novi zahtev. |
Ne razumem jedno - želiš da sprečiš postovanje s drugog sajta - ok - a kako izlaziš na kraj ako dođe na tvoj sajt i odatle odradi malo spamovanje od 700 PP?
|
Pa to mu se ne isplati :) Mnogo dugo traje, oni ne rade to tako.
|
Kako im ipak predstavlja napor da na svom serveru odrade skriptu za utovar, isti posao može da se odradi i s klijentske strane. Na klijentu može da se modifikuje stranica - primer - doda se iframe, promeni target formulara na taj iframe, i čak uglavi skripta za cirkularno prosleđivanje formulara - dok ti redovno primaš da je referer s tvog sajta ;-)
(uglavnom, lepa je tema, moram na spavanje... nastaviću se kasnije) |
Citat:
|
@oliver: Pa to je za sada najočiglednije rešenje...
@noviKorisnik: mislim da te nisam razumeo šta pokušavaš da kažeš. GET -> POST nije nikakvo osiguranje. Ko spamuje, njemu je sve jedno :) (iako je sve kod mene vec POST) Znači, ona kada treba da pošalje poruku, mora da kline na "new message" gde mu izađe formular. Neki predlažu da tu dodam neki "secret" code u session koji proveravam kada klikne na "send". Ja sam čak nešto razmišljao da encrypt-ujem podatke, dovoljno je samo username primaoca koji se encryptuje nekim ključem... |
Dakle, "new message" pa izađe formular. A tada stupa na snagu klijentski DOM skripting - dokument može da se prilagodi za potrebe spamovanja (dodavanje ifrejma, targetiranje formulara na njega i automatika za cirkularno submitovanje).
Ovo je samo jedan primer, verovatno postoje jednostavnije metode da ti stigne info da je referer s tvog sajta a da nije sve baš "čisto". Prema onome što sam čitao može eksplicitno da se podesi koja će vrednost referera da stiže na server (ne znam kako tačno, nadam se da ne moram to da dokazujem). Verovatno može dosta da te ojadi i curlovanjem, itd. ... Ubacivanje intervala između poruka je vrlo pipava stvar koja treba da balansira između ograničavanja potencijalnog spamera i potrebe realnog korisnika za slanjem više uzastopnih poruka. (što znači da je 3 minuta već preterana vrednost, 1 minut bi već mogao da bude dopustiv za korisnika ali spameru već daje prilično komotan prostor). ... Sve pomenute muke oko hashovanja mi deluju zaludno, jer ako se jednom otvori formular mogu da se pokupe tajne vrednosti koje se tamo pronađu i iskoriste za 800 submitovanja formulara. ... Rešenje: Neka se na formularu nalazi vrednost koja može da se iskoristi najviše jednom. |
Ili, uvedi ograničenja na broj poruka dnevno, klasirano:
|
1 minut za pisanje poruke?
Morao sam da dignem session_lifetime na 15 minuta jer nekima ni 15 minuta nije bilo dovoljno da napisu poruku :) Cak sam im napravio da kada kliknu "send", ako je session expired, ispise im poruku i ostavi im ceo tekst kako su uneli da nebi ponovo k(lju)ucali :) Problem je u tome sto ja novim clanovima dajem prvih 24 časa unlimited pristupa da vide kako to izgleda (malo makretinga) a kasnije im se resetuje access na FREE, i onda imaju limit od 4 poruke za 12 sati. E sad, ovi spameri se registuju i to što šalju - šalju i prvih par sati. Hteo sam da ograničim broj poruka dnevno svima, međutim onda sam primetio da neki savim regularni članovi šalju po 80-100 poruka dnevno koje nisu spam. Onda ima onih koji startuju sve što im piše Ž pored profila i šalju svima poruku "ćao ja sam ,... ako si za neobavezan sex - javi se". Iako je to neverovatno glupo, to su ipak sasvim regularne poruke i pošto su VIP članovi imaju pravo da šalju neograničen broj poruka. Dakle, problemi su višestruki, a rešenje je samo 1 :) Ja sam čak hteo da AJAX-ujem ali sam posle kraćeg razmišljanja provalio da ne bih ništa time dobio. Hteo sam da ecnryptujem poruke koje se descrypt-uju pred upis u bazu - nisam siguran da je to zadovoljavajuće rešenje jer bih morao da imam promenljive ključeve kao i promeljive varijable koje encrypt-ujem da bi bio siguran. Najsigurnij rešenje je ono što je neko ovde predložio, da stavim neki kod kao image pa da moraju da ukucaju kod sa slike pre slanja. Međutim to je mega smaranje i tako kažnjavam one koji su tu sasvim regularno, a takvih je ipak 99.5%. |
A da stavis taj kod i sliku samo korisnicima u onih prvih 24h?
Mislim da bi tako moglo i da ne bi bilo preveliko smaranje korisnika (a i sam kazes da spameri uglavnom salju te poruke u prvih nekoliko sati). Ako i vidis nekog VIP korisnika da spamuje, mozes samo i njemu da to ukljucis... |
Bluesman, majstor si da ne pročitaš ono što napišem - 1 minut (ili 3)... minimalno vreme između slanja 2 uzastopne poruke - flood control, čini mi se da se tako zove.
Kao da sam malo dokon, pa ću citirati sebe... Citat:
Kad se formular prosledi, proveri se: - da li je tajmstemp stariji od 15 minuta - ako jeste - formular istekao - kraj - da li identifikator odgovara hešu tajnog koda servera + ida korisnika + tajmstempta - ako ne odgovara - krivotvoreni formular - kraj Ako nije puklo na ovim proverama, pokušava se upis u bazu. U slogu za upis nalazi se i identifikator formulara koji treba da ide u UNIQUE kolonu tabele, pa - ako ne uspe upis - spam - ponovno prosleđivanje istog formulara - kraj |
Citat:
I dalje smatram da je u ovom unosu izloženo do sada najobuhvatnije rešenje, sve dok mi neko ne dokaže suprotno ;) Nego sad kad nešto malo bolje razmislim - Gorane zar sistem u kome neki (privilegovani/VIP/etc) član ima mogućnost da pošalje (teoretski) neograničen broj poruka u konačnom vremenskom intervalu bez ograničenja broja poslatih poruka sa strane servera nije u suštini insecure by design? |
U suštini jeste ali to nije suština problema :)
Sir, You're making a scene :) |
Postoji potrebno i dovoljno rešenje ovog problema i mislim da je prilično očigledno i (relativno) jednostavno za implementirati.
Nego Blues, stvarno bi trebalo da poslušaš Petra i staviš neki unbreakable mehanizam u koji ćeš uložiti 4 radna dana. Ionako je programerski sat najbezvrednija stvar na ovoj planeti. |
Meh, moje je da pokušam da propagiram inženjerski pristup - na Vama je da odlučite da li ćete me poslušati. Stvar izbora...
Red pill or blue pill, I dont give a f*ck, it's your own funeral anyway ;) |
Evo upravo veceras se desilo ono drugo o cemu sam pricao. Normalan clan, platio clanarinu, i poslao je danas 104 poruke, uvek sa istim tekstom tipa "cao mace, ja sam ... javi mi se na mob. ... hajde da se zezamo".
Tu je sve regularno, ne mogu njega da ogranicavam. Ako njega ne mrzi 104 puta da klikne "new message" pa 104 puta "send" ... to nije moj problem :) Ilija, jednog dana mora i to da dodje na red. Mozda ne mora da bude unbreakable, ali treba da bude dovoljno tezak da neko bas mora da se pomuci i da odustane pa ode na neki drugi sajt... Ja razumem petra sta hoce da kaze, ali petre, ovo je specifican sistem. To je specifican community, neki su navuceni totalno, znam sigurno da postoje neki agorofibicni clanovi (strah od kontakta sa ljudima) kojima je to jedini prozor u svet, ima dosta stidljivih kojima je to jedini nacin da komuniciraju, ... vrlo specificna grupa ljudi. Ne mozes tek tako da kazes "max broj poruka dnevno je 100". Verovao ili ne, nekima zivot zavisi o chatu i sms-u.... mnogo je kompleksnije nego sto moze da se ucini na prvi pogled. |
Sad se razumemo, whatever pays the bills ;)
BTW, u mom rodnom kraju za takve kažu zagoreli :) |
Citat:
|
Citat:
|
Postavio sam za sada samo kontrolu vremena od poslednje poruke. Stavio sam na 2 minuta, i ako je poslednja poruka mladja od 2 minuta, ne dozvoljava slanje.
Nije resenje problema, ali je bar otezavanje spamerima, samo da vidimo kako ce to da utice na usere, da li ce shvatiti o cemu se radi. |
Vreme je GMT +2. Trenutno vreme je 08:45. |
Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.