« 1 2 »
Autor Zpráva
john
Profil *
Dobrý den používám ajax pro odesílání zpráv.

ale když jsem tak přemýšlel tak jsem přišel na velice snadný hack.
a vůbec nevím jak by se toto dalo ošetřit

hack:
když někdo ve firebugu napíše ajax na url ktera mi zapisuje zpravy a zada pouze id uzivatele a nejaky text a spusti to treba 100x tak se odesle 100 zprav.. :(

vubec nevím jak by se toto dalo vyřešit. Je vůbec toto odesílání bezpečné.?

Předem děkuji za odpovědi je to opravdu důležité
Medvídek
Profil
john:
Ale to přeci vůbec není věc ajaxu. Pokud by si to posílal normálně, tak by si to musel ošetřit.
john
Profil *
používám JQUERY


jakto.. kdybych to posílal normálně tak tu akci nenapíši ve firebugu takto se to dá ve firebugu snadno zapsat a skript běží a ajax nekouká na to že je to napsáno z firebugu...
Medvídek
Profil
To je celekm jedno, ale pokud by si to stavěl bez ajaxu, tak by si to přeci také musel zabezpečit, ne? Můžeš si třeba hlídat čas posledního odeslání příspěvku.

john:
jakto.. kdybych to posílal normálně tak tu akci nenapíši ve firebugu takto se to dá ve firebugu snadno zapsat a skript běží a ajax nekouká na to že je to napsáno z firebugu

To je snad jedno ne, tak by si to odesílal jak? Klasicky formulářem metodou GET, kde by sisi předával ID uživatele? Tak místo Firebugu bych si napsal vlastní skript, který bych ti posílal na tu URL.
Tak to ajaxem neposílej metodou GET ale POST, ale stejně to neřeší nic na tom, že tohle musíš mít ošetřený na straně serveru.
john
Profil *
no nevím jak bych to zabezpečil kontroluji pouze jestli promenne nejsou prazdne..

a kdybych hlidal cas napr na 1min. tak i tak kdyz budu sedet u firebugu a po minute dam spustit tak to je uplne to same..

nevite jak by se tato problematika dala vyřešit.?
Medvídek
Profil
john:
a kdybych hlidal cas napr na 1min. tak i tak kdyz budu sedet u firebugu a po minute dam spustit tak to je uplne to same
Ale to přeci nejde vyřešit, tady se nebavíme o Firebugu, ale o zabezpečení aplikace. Pokud to někdo záměrně bude chtít napadnout, tak to prostě napadne.

Jak chceš odlišit, jestli ti někdo napíše 20 zpráv za minutu přes skript ze stránek, nebo přes firebug?
john
Profil *
takže to znamená že každá aplikace která používá ajaxové požadavky se dá takto snadno napadnout.??


například nějakým zákodováním nebo tak něco nějaké zakódování url či tak něco.. neřikejte mi, že spam webů s ajaxem je tak jednoduchy...
Medvídek
Profil
john:
Já používám ajax celekm dost a nemyslím si, že by to šlo nějak napadnout. Pořád to je stejná komunikace a musíš řešit to samé zabezpečení. Akorát to probíhá bez refreshe stránky. Ale furt to je to samý. Nějaký data se odesílají a někde se zpracovávají. Kudy tam tečou je celkem jedno.

Já mam třeba u složitějších výpisů hlídaný časy požadavků, takže kdyby mě bombardoval třeba každou vteřinu, tak mu budu posílat nacachovaný data, dokad neuplyne nějaká moje stanovená doba. Ale to si hlídá aplikace na straně serveru.


john:
například nějakým zákodováním nebo tak něco nějaké zakódování url či tak něco.. neřikejte mi, že spam webů s ajaxem je tak jednoduchy...
Ale furt nechápu, co chceš řešit. Pokud to chápu, tak máš nějaký chat, kde ajaxem vkládáš pomocí ID uživatele zprávy. Tak si jeho ID ulož do SESSION a nepředávej to ID vůbec v parametru. Já si třeba u citlivějších věcí předávám POSTem jen klíče pole SESSION, ve kterym jsou pak už pod klíčema uložený ty data.

Takže buďto přidělíš uživateli po vstupu (nebo přihlášení) do SESSION jeho ID, enbo musíli být předáván nějaký parametr, který se třeba váže k prvkům na stránce, tak si ho uloždo pole. $_SESSION["tajneID"][1]=9856;
john
Profil *
dobře no.. není to věc ajaxu avšak s ním to mají spameři jednodužší.. stačí aby se koukli na zdrojak javascriptu a zkopirovali si ajax kde si vyplni promene ktere chtej a hodily do firebugu a jedou..

snad jednou přijdu na to jak to nějak zabezpečit..

ale vrtá mi hlavou např nějaké větší komunitní weby to musí mít nějka extra zabezbečené jinak by to přeci nešlapalo..


jenže to id i text zprávy beru javascriptem z inputu a textarey..

"předávám POSTem jen klíče pole SESSION"

co tím myslíš..? SESSION chápu ale co myslíš tím klíče..?
Medvídek
Profil
john:
Ale tak to snad maj zabezpečené každý průměrný stránky a není to jen tím, že je doba AJAXu a Firebugu. Tak si nepředávej nic GETem a ulož si všechno do SESSION.
john
Profil *
já si vše posílám POSTEM, GETEM jen tam kde to jinak nejde ale s tim SESSION děkuju určitě budu používat ale asi těžko tam kde beru informace jako $("input").val();

nevíte jest-li je někde na internetu kniha či článek o takovýhlech všestraných zabezpečeních.?
Medvídek
Profil
john:
Mam třeba portál, kde má uživatel různý počet widgetů, který mají ajaxový refresh. Každý widget má svoje ID. Ale abych to ID uživateli neukazoval, tak jsou uloženy v SESSION jako hodnoty v poli.

Čili:

$_SESSION["widget"][0]=1254;
$_SESSION["widget"][1]=5423;
$_SESSION["widget"][2]=8555;
$_SESSION["widget"][3]=45;

V HTML má každý svůj widget div s ID jeho klíče.

<div id="widget0"></div>
<div id="widget1"></div>
<div id="widget2"></div>
<div id="widget3"></div>

a ajaxem si volám skript, kde mu předám všechny hodnoty ze session, on mi k nim vrátí výsledky a ty si JSONem vrátim zase s klíčema těch ID, a podle toho je přiřadím k těm widgetům.
Navíc mi XMLRPC rozhraní hlídá požadavky na různý widgety, takže některé mohou mít refresh jednou za minutu, další jednou za 10 minut. Podle toho vracim čerstvý data, nebo jen cache.
john
Profil *
aha děkuji :) celkem jsem to pochopil :) ale bohužel se tato metoda nedá použít u věcí které právě napíše uživatel.. ale pouze ve věcech které jsou stálé aby se předem mohli zaregistrovat do SESSION s určitými klíči..
Medvídek
Profil
john:
Tak tahle metoda je na výpis dat. Potřebuje zapisovat? Tak si postem předávejte to co napíše a kontrolu opět provádějte pomocí SESSION. Třeba si ukládejte poslední čas příspěvku.

if(isset($_SESSION["lastPost"])){
  if((mktime()-$_SESSION["lastPost"])>60){
   $json["status"]=200;
     INSERT TO DB
    $_SESSION["lastPost"]=mktime();
  }
  else{
   $json["status"]=400;
  }
}
else{
 INSERT TO DB
 $_SESSION["lastPost"]=mktime();
}

Ber to jen takovej rychlej nástřel.
john
Profil *
nevšiml jsem si jedné zprávy promin..

ano uložím si třeba po přihlášení uživatele jeho id do session..

$_SESSION['tajne_id']=9547;

no jo.. jenže co potom stím ?

když budu zapisovat zprávu tak ověřím zda vůbec je naplněna a poté.?
Medvídek
Profil
john:
když budu zapisovat zprávu tak ověřím zda vůbec je naplněna a poté.?
No záleží co potřebuješ zabezpečit. Přidávání počtů zpráv za minutu? Tak viz předešlý příspěvek. Nebo něco jiného?
john
Profil *
Děkuji za tvoji snahu popíši příklad do podrobna.

při kliknutí na $element se provede ajax kterej odešle POSTEM 2 proměnné
jedna je obsah inputu, ta nese nějaké id
druhá je obsah textarey

ajax to pošle na "postMessage.php";

a v php ověřím zda-li nejsou proměnné prázdné pokud ne provede se INSERT DO DB

takže tvé řešení chápu asi takto:
při přihlášení uživatele zaregistruju $_SESSION['tajne_id']=$user_id;

a tím pádem postMessage.php bude dále kontrolovat zda session existuje a dále už nevím :)
Medvídek
Profil
john:
Na straně serveru si ohlídáš, jestli není prázdná SESSION a inputy a zapíše. Co víc chceš ochránit?
john
Profil *
dobře alespoň něco :) děkuji ti za pomoc..

přišel jsem na to že zabezpečení je horší než samotné sestavení aplikací.... tak díky ;-)
Medvídek
Profil
john:
přišel jsem na to že zabezpečení je horší než samotné sestavení aplikací.... tak díky ;-)
Spíš to spolu úzce souvisí.
john
Profil *
ještě se jenom zeptám. opravdu nevíš jestli je o tom nějaká literatura..? či články na internetu..?
Kcko
Profil
john:
Nejsi zrovna dvakrát chápající ;-).

Proste při uložení příspěvku si do sešny ulož čas a při dalším uložení ten čas zkontroluješ proti aktuálnímu času. A pokud bude rozdíl větší než tebou nastavený (třeba 30s tak vypíšeš SPAM, asi robot, nebo nepiš tak rychle uživateli, v opačném případě příspěvek uložíš)
john
Profil *
už jsem pochopil. ;-)

s tím časem jsem si to takto připravil ale zajímá mě něco o mktime

a co je ten status.? kdyz posilam ajax tak v dom je nastaven na 200 k cemu vlasten slouzi..?
Medvídek
Profil
john:
mktime()
Ty statusy tam mam víceméně pro sebe, podle toho se rozhoduju, co aplikace udělá.
john
Profil *
no jasne ale v tom příkladu co jsi mi poslal včera večer jsi status použil ale nikde si jej netestoval..

nebo si ten status potom vracis ajaxem..?
Medvídek
Profil
john:
Tak už mě napadlo, že by sis to mohl domyslet, když sem to nazval $json["status"]. Ale ano, potom proženu všechno funkcí echo json_encode($json); a pracuju s tím na straně JS.
john
Profil *
jj myslel jsem si to ale tak furt lepší mít jistotu abych věděl přesně jak se ten skript chová. ale chtěl jsem se ještě zeptat co ten status znamená vím že jsem to viděl i ve firebugu v kartě DOM když jsem poslal ajax..

znamená to že 200 je v pořádku a 400 že je něco špatně..?
Medvídek
Profil
john:
Opět, píšu znova:

Medvídek:
Ty statusy tam mam víceméně pro sebe, podle toho se rozhoduju, co aplikace udělá.

Můžeš tam při úspěchu nacpat třeba "borůvka" a při neúspěchu "třešeň", je to jedno, záleží na tom, s čim se ti bude lépe pracovat.
john
Profil *
jj to jsem pochopil jen mě zajímalo co to znamená v DOM ;-).

Tak ti děkuji za tvé rady. si asi tak jediný který na mě reaguje a dokáže opravdu dobře poradit ;-) díky ti :)
Ugo
Profil
tak já se taky přidám :)
1. AJAX a normální formulář se nijak neliší, jedno odešle prohlížeč na pozadí a druhý přes refresh stránky nebo části stránky (target=frame). Kdybych tě chtěl zaspamovat tak obojí vyřešim na straně svého PHP serveru nikoliv firebugu.
2. spamu se nemůžeš úplně vyhnout, omezovat uživatele v čase musíš velice dobře přizpůsobit a někomu kdo chce spamovat je jedno jestli pošle 1/2 vteřiny, stejně toho dokáže poslat mraky. doporučuji používat nějakou hash údajů. Vygeneruj si třeba hash času se solí, dej to jako třetí POST, v případě že nebude pasovat na hodnotu uloženou v SESSION - zahoď požadavek, po insertu vygeneruješ novej "lístek na odeslání". Při úspěšnym odeslání si vygeneruj hash těch 2 odeslanejch polí a pokud další požadavek bude mít stejnou hodnotu - zahod ho. Já na odesílání formulářů používám něco podobnýho, když není post požadavek tak si vygeneruju a uložim do session nějakej hash, kterej hodim i do formuláře, v případě postu je porovnám a zařídim se podle toho. Nad limitem času jsem nějak neuvažoval i přesto, že efekt by byl úplně stejnej a bylo by to rychlejší :)

Nedokážu na pár řádcích napsat rozumně návod na něco na co návod neexistuje, většina zabezpečení (takto lehkého) neni o knihách, ale o intuici a fantasii.
« 1 2 »

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0