Autor Zpráva
BuGeR
Profil
Zdravím.
Mám jen takovou otázku.
Na webu mam script ve smyslu
var score = 10;
document.location='http://web.cz/stranka.php?skore='+score;

jenže to "score" je hraje významnou roli a byl bych nerad kdyby si to někdo změnil (např. by změnil stranka.php?score=200).
Jak by jste udělali takové "zabezpečení" aby na stránku přišlo správne "score"?
Uvítam cokoliv. Děkuji.
Chamurappi
Profil
Reaguji na BuGeRa:
Jakákoliv komunikace klienta se serverem je odchytitelná a upravitelná. Vstupní data nikdy nejsou stoprocentně důvěryhodná.

Uvítam cokoliv.
Bude to složitější: vstupní všechny parametry vymyslí server, pak je pošle klientovi, klient na jejich podkladě odehraje hru, JavaScriptem se pošle celý herní postup na server, server prověří, jestli postup pasuje na vstupní parametry, a spočítá z něj skóre.
BuGeR
Profil
Dobrá děkuji, zkusím něco :).
Ještě otázka, nešlo by to nějak vyřešit pomoci hashe?
Kcko
Profil
BuGeR:
Slo. Kdyz si udelas neco jednoducheho typu ?hash=5b32fdsfa778 ( a budes vedet ze to je skore 300 a k tomu treba datum dnesniho dne) tak to nikdo neocura :)
BuGeR
Profil
No jo, jenže problém je, že když to bude třeba md5() tak to bude vypadat např. takto:
document.location='http://web.cz/stranka.php?skore='+md5(score);

jenže co když si uživatel tu md5 někde generuje ?
Kcko
Profil
a ty si nemuzes pripravit ten hash v PHP?

var score = '<?= someHashFn(10); ?>';
BuGeR
Profil
Ne, protože se to odehráva bez načtení stránky - načte se jen jednou a to ta proměnná score je ještě prázdna
Kcko
Profil
BuGeR:
A coz do toho nechat zasahnout server pomoci Ajaxu?
Webb
Profil
Kásnou funkci JQuery
$.get();
Chamurappi
Profil
Reaguji na Kcka a Webba:
Jak mu AJAX nebo ta kásná funkce vyřeší problém s věrohodností dat, když opět to, co pošle na server, může být podvržené?
Trevor
Profil *
Javascript umí odesílat data serveru ? To jsem netušil. Je to opravdu tak ?
Webb
Profil
Chamurappi:
Jak mu AJAX nebo ta kásná funkce vyřeší problém s věrohodností dat, když opět to, co pošle na server, může být podvržené?

mno to je pravda, ale rozhodně lepší než to posílat přes url, třeba to poslat pomocí ajaxu ješte v md5(). Sice tam bude pořát riziko ale čim dál menčí, není to úplné řešení ale zatím tu nevidim jiný nápad.
Kcko
Profil
Chamurappi:
Ano, muze byt a jelikoz to bude kontrolovat na strane serveru, tak muze zjistit jestli to podvrzene je ci neni.
Proto je muj napad nasledujici:

Posle si na server nasledujici hash, ?skore=8755fde3kfds3 // na serveru zjisti ze to je skore 15 a ulozi ho.

PS. A jak zjisti ze onen hash je skutecne skore 15? Jednodusse.

Na serveru muze mit funkci, ktera mu to zjisti:

function getCipher($skore) {
for ($i = 1; $i <= 100; $i++ )
 if (sha1($i + "someSalt") == $skore) return $i;
 
return false;

}


Samozrejme, pokud skore muze nabyvat hodnot mnohem vyssich, treba i do tisicu, byl by nesmysl vytvaret kontrolu takto. Neznam presne zadani a prubeh aplikace, ale vyresit to jiste lze.
_es
Profil
Kcko:
Posle si na server nasledujici hash, ?skore=
A ten reťazec "8755fde3kfds3" sa na strane klienta vytvorí ako?
Kcko
Profil
_es:
Na strane klienta, bez toho to nepujde. Bude muset kod aplikace trosku poupravit. Bude muset proces pri vypoctu skore "konzultovat" se serverem.

Mas lepsi napad? Pokud ano, tak ho predloz nebo do me zbytecne nerypej jako pokazde :-) ty pobocniku Chamurappiho
Bubák
Profil
_es:
A ten reťazec "8755fde3kfds3" sa na strane klienta vytvorí ako?
Pravděpodobně pomocí JS funkce, které se vstupu předhodí "score". To, že funkce nepozná, jestli jí předhazuje skutečné, nebo podvržené "score", je drobnost, a jestli se výpočet "konzultuje" se serverem, nebo ne, je úplně šumák.
Str4wberry
Profil
Osobně bych se držel toho, co napsal Chamurappi. Podstatné je, že se skóre bude počítat na serveru na základě splnění nějaké podmínky.

Jinak k tomu hashi je důležité dodat, že by pro každého návštěvníka měl být jiný.
_es
Profil
Kcko:
do me zbytecne nerypej jako pokazde

Posle si na server nasledujici hash, ?skore=8755fde3kfds3
Pýtal som sa len, akým spôsobom sa ten reťazec vygeneruje, lebo to si nenapísal.
jelikoz to bude kontrolovat na strane serveru, tak muze zjistit jestli to podvrzene je ci neni.
Takže podľa tvojho návrhu sa to skóre môže na strane klienta podvrhnúť úplne rovnako, len tam je krok navyše - vyrátanie hashu zo skóre cez JS funkciu. A je to vlastne z hľadiska bezpečnosti voči "podvrnutiu skóre" rovnako "bezpečné" ako kód v prvom príspevku tejto diskusie.
Str4wberry
Profil
_es: Ten hash by zřejmě generoval server. A bezpečnost tkví v tom, že útočník nebude znát hash pro vyšší jiné skóre, než měl.
_es
Profil
Str4wberry:
Ten hash by zřejmě generoval server. A bezpečnost tkví v tom, že útočník nebude znát hash pro vyšší jiné skóre, než má měl.
No ale predsa stále zostáva základný problém, na základe čoho ten server ten hash vygeneruje, teda vlastne niečo na spôsob Chamurappiho hrubého náčrtu.
Chro
Profil
BuGeR:
Nebylo by řešení v javascriptu spojit řetězce timestampu před přesměrováním a score do jednoho, zahašovat ho v md5, vložit do url a odeslat? PHP si následně zjistí čas přijetí požadavku, podle něho cyklem vytvoří pravděbodobné kombinace timestampu a score, zahašuje, porovná je s hašem z url a pokud najde shodu v haších, zjistí score? Celkem mi to přijde jako šílený postup, ale myslím, že nad čím nemá hráč kontrolu, je vždycky přesný čas. :-)
Trevor
Profil *
A umí něco takového i Flash ? Tam záleží jen na té odkazovací adrese né ? Je o tomhle nějaký článek ?
_es
Profil
Chro, Trevor:
To všetko je len točenie sa dokola, len iným spôsobom.
Čo bráni užívateľovi, aby podvrhol to skóre rovnakým spôsobom, ako by to urobil JS, AS Flashu, alebo iný programovací jazyk na strane klienta automaticky?
Str4wberry
Profil
No, v podstatě jde akorát o to, že to skóre bude zahashované, takže bude téměř nemožné si odvodit adresu pro ruční úpravu skóre.

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0