Stránka: 1 z 1
| [ Príspevkov: 15 ] | |
| Autor | Správa |
|---|
Registrovaný: 22.01.08 Prihlásený: 19.04.15 Príspevky: 492 Témy: 135 | 135 Bydlisko: Bratislava ... |
Zdravím.
mam taky problém, a riešiť ho naozaj neviem.
mám dva súbory, a to 1.php a 2.php.
funguje to tak, že prídete na 1.php, odošlete informácie (pomocou AJAX kodu) na subor 2.php.
v tom 2.php sa informácie generujú NAHODNE a potom sa ulozia do txt suboru, aby som ich mal.
Ale teraz nastáva problém ten, že niekto si môže spraviť
form action="2.php" a vymení mi záznam za iný. A to je fakt problém.
Spolahlivé riešenie ako tomu predísť som nenašiel.
Predostriem tu dve svoje riešenia a to boli:
1. najprv HTTP referer, to ale zlyhalo - pozrite napriklad na firefox addon Refcontrol a uz jsme doma, toto sa škrtá.
2. na 1.php som isiel cez session, a overoval ju na 2.php, tu bol problem v tom ze niekto prisiel na 1.php a teda session ostala, a form actionom to zmenil z ineho svojho suboru, takze toto tiez stratilo efekt.
ja uz naozaj neviem nejake bezpecne riesenie, kedze su tie informacie nahodne tak to je problem...
neporadil by mi niekto prosím?
|
|
Registrovaný: 09.07.08 Prihlásený: 17.01.15 Príspevky: 1585 Témy: 96 | 96 |
fakt som sa snažil, ale nepochopil som...
_________________ neříkejte, že něco nejde udělat, protože se vždycky najde nějaký blbec, co neví, že to nejde – a udělá to! |
|
Registrovaný: 21.02.07 Prihlásený: 21.02.10 Príspevky: 3984 Témy: 96 | 96 |
Ani ja som nejak extra neporozumel. Skús použiť tokeny. Teda vygeneruješ reťazec, ktorý uložíš do DB (alebo session), a zároveň pošleš do formulára ako hidden input. v 2.php overíš či číslo, ktoré prišlo z formulára existuje v DB (alebo session). Samozrejme treba nastaviť časovú platnosť tokena, napr. na 10 min. O tokenoch sa na internete ešte veľa dočítaš ...
|
|
Registrovaný: 22.01.08 Prihlásený: 19.04.15 Príspevky: 492 Témy: 135 | 135 Bydlisko: Bratislava ... |
ospravedlnujem sa za chaoticke popisanie problému, ale v podstate ste pochopili.
hej tokeny to bude asi ono...ze ma to vobec nenapadlo.
|
|
Registrovaný: 22.01.08 Prihlásený: 19.04.15 Príspevky: 492 Témy: 135 | 135 Bydlisko: Bratislava ... |
Ale problem je v tom, ze v tom 1.php mam ten ajax kod, a ja musím dať potom niečo v tomto zmysle:
xhr.open('POST','2.php?id=<?php echo $_GET['id'] ?>&pp=<?php echo $token ?>',true);
no a ked si to dotycny otvorí vo firebugu, hned vidí napr. tvar 2.php?id=1&pp=XJFL-456
a to zadá do form actionu, a uz je tam,.
|
|
Registrovaný: 21.02.06 Prihlásený: 08.12.14 Príspevky: 5403 Témy: 30 | 30 Bydlisko: Bratislava |
Keby si v 1.php inicializoval nejakú premennú v SESSION a v 2.php kontroloval, či je táto premenná nastavená?
A ak to chceš ochrániť proti viacnásobnému zavolaniu, tak predávať tomu súboru 2.php nejaký token, ktorý sa bude môcť použiť iba raz.
_________________ Neradím a nekomunikujem cez SS, ak niečo potrebujete, máte iné možnosti: Ak vám zmizla téma, alebo sa vám niečo nepáči. Ak potrebujete nahlásiť príspevok/človeka, reportujte ho. Ak máte s niečim problém, riešte to v danej téme. |
|
Registrovaný: 22.01.08 Prihlásený: 19.04.15 Príspevky: 492 Témy: 135 | 135 Bydlisko: Bratislava ... |
mal som to vymyslené tak že na 1.php sa vygeneruje token a uloží do db, a v 2.php bude kontrolovat ci je v linku ten co bol vygenerovaný, ak hej tak by sa potom stejne zrušil.
|
|
Registrovaný: 22.01.08 Prihlásený: 19.04.15 Príspevky: 492 Témy: 135 | 135 Bydlisko: Bratislava ... |
hej shaggy ale pocuj, najvacsi problem v tych tvojich rieseniach dvoch je ze ked ja nastavim tu session premennu v 1.php, tak potom on príde na 1.php ale nepojde dalej, premenna sa nastaví, on si spraví súbor na form action a už je tam. to iste s tokenom, na 1.php sa token nastaví, on si ho pozrie, (takže token ešte stále platí lebo nebol použitý) a pošle opat tym form actionom...
takze v tomto je problém.
|
|
Registrovaný: 21.02.06 Prihlásený: 08.12.14 Príspevky: 5403 Témy: 30 | 30 Bydlisko: Bratislava |
B.A.X.O. - nejak ti nerozumiem o čo ti ide, možno by bolo dobré, ak by si nám napísal presne, čo riešiš a čo sa snažíš dosiahnuť. Ochrana tokenom by mala byť v tomto prípade bezproblémová, ale keďže ti celkom nerozumiem, tak ti možno radím zle.
Skús to trochu presnejšie opísať (dať ukážku, konkrétny príklad).
_________________ Neradím a nekomunikujem cez SS, ak niečo potrebujete, máte iné možnosti: Ak vám zmizla téma, alebo sa vám niečo nepáči. Ak potrebujete nahlásiť príspevok/človeka, reportujte ho. Ak máte s niečim problém, riešte to v danej téme. |
|
Registrovaný: 22.01.08 Prihlásený: 19.04.15 Príspevky: 492 Témy: 135 | 135 Bydlisko: Bratislava ... |
ok tak prakticky:
1.php
Kód: <!DOCTYPE html>
<head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1250"> <link rel="stylesheet" href="style.css">
</head>
<title> </title>
<body>
<?php
echo "<input type='button' onclick='aktivuj_request();' value='Start Ajax'><br>"; echo "<span id='nieco'></span>";
?>
</body>
</html>
<script type="text/javascript">
var udaj = document.getElementById("nieco");
function aktivuj_request() {
var xhr = new XMLHttpRequest(); xhr.open('POST','2.php',true); xhr.onreadystatechange = function() { if (xhr.readyState == 4){ var vysledok = xhr.responseText; udaj.innerHTML = vysledok; }
}
if (xhr.overrideMimeType) xhr.setRequestHeader('Connection', 'close'); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('a='+encodeURIComponent(udaj.innerHTML));
}
</script>
2.php Kód: <?php
$random_cars = array( "Audi R8", "Ford GT", "Porsche Carrera GT", "Lamborghini Gallardo", "Ferrari Enzo" );
$cislo = rand(0,4);
echo $random_cars[$cislo];
$subor = "subor.txt"; $fh = fopen($subor, 'w'); fwrite($fh, $_POST['a']); fclose($fh);
?>
subor.txt (na vkladanie) Kód: ...
no a teraz si sprav napr. shaggy.html a tam si daj toto: Kód: <form action="2.php" method=post> <input type=hidden name=a value=400> <input type=submit> </form>
takže na 2.php sme si vylosovali Ford GT hmm, ale po odoslani suboru s form actionom sa asi lotéria zriekla dodať cenu, keďže je tam zrazu Audi R8.
//a lepsie uz to naozaj vysvetliť neviem. proste si pozri aky efekt robí ten html subor s form actionom, a bude ti jasné proti čomu sa chcem obrániť.
|
|
Registrovaný: 21.02.06 Prihlásený: 08.12.14 Príspevky: 5403 Témy: 30 | 30 Bydlisko: Bratislava |
Ale ja stále nechápem kde je problém.
Príde na 1.php, ty cez AJAX voláš 2.php, pričom mu ako parameter pridáš nejaký token (ktorý si zapíšeš do databázy). Ak sa zavolá ten súbor 2.php s príslušným tokenom, zrušíš platnosť toho tokenu a potom si môže volať 2.php koľkokrát chce, nebude to fungovať.
Priznaj sa, že si ty tie tokeny ani neskúšal, však?
_________________ Neradím a nekomunikujem cez SS, ak niečo potrebujete, máte iné možnosti: Ak vám zmizla téma, alebo sa vám niečo nepáči. Ak potrebujete nahlásiť príspevok/človeka, reportujte ho. Ak máte s niečim problém, riešte to v danej téme. |
|
Registrovaný: 22.01.08 Prihlásený: 19.04.15 Príspevky: 492 Témy: 135 | 135 Bydlisko: Bratislava ... |
no skusil som niečo takéto ale nepôjde to. ked dotycny pride na 1.php BEZ toho aby aktivoval tlačítko na zahajenie ajax requestu...tak sa vygeneruje token ktorý doplní do svojho form actionu, a pri aktivovani form actionom sa to prepíše a až potom sa zruší token.
ak som to napísal zle, tak ma prosím upozorni.
1.php
Kód: <!DOCTYPE html>
<head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1250"> <link rel="stylesheet" href="style.css">
</head>
<title> </title>
<body>
<?php
session_start();
echo "<input type='button' onclick='aktivuj_request();' value='Start Ajax'><br>"; echo "<span id='nieco'></span>";
$pole = array( "heh", "lol", "pup", "dep", "ehk" );
$cislo = rand(0,4);
$_SESSION['token'] = $pole[$cislo];
?>
</body>
</html>
<script type="text/javascript">
var udaj = document.getElementById("nieco");
function aktivuj_request() {
var xhr = new XMLHttpRequest(); xhr.open('POST','2.php?pp=<?php echo $_SESSION['token']; ?>',true); xhr.onreadystatechange = function() { if (xhr.readyState == 4){ var vysledok = xhr.responseText; udaj.innerHTML = vysledok; }
}
if (xhr.overrideMimeType) xhr.setRequestHeader('Connection', 'close'); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('a='+encodeURIComponent(udaj.innerHTML));
}
</script> 2.php Kód: <?php
session_start();
if($_GET['pp'] == $_SESSION['token']){
$random_cars = array( "Audi R8", "Ford GT", "Porsche Carrera GT", "Lamborghini Gallardo", "Ferrari Enzo" );
$cislo = rand(0,4);
echo $random_cars[$cislo];
$subor = "subor.txt"; $fh = fopen($subor, 'w'); fwrite($fh, $random_cars[$cislo]); fclose($fh);
$_SESSION['token'] = null;
}
?>
Ja by som potreboval niečo ako nahrášku HTTP_refereru.
|
|
Registrovaný: 13.11.07 Prihlásený: 20.08.16 Príspevky: 1702 Témy: 0 | 0 |
Už som ti to písal na inom fóre. Ak nechceš, aby mohol návštevník meniť údaje, tak ich nevkladaj do html kódu a nenechaj si ich posielať (a tak ich nebude môcť zmeniť).
Stále neviem, čo presne chceš dosiahnuť, takže možno budem písať o úplne niečom inom.
Ak chceš napr. aby si používateľ niečo vylosoval, tak pomocou Ajax "prebehne" to losovanie takým spôsobom, že server vygeneruje výhru, niekam si ju uloží (do session alebo do DB) a pošle to ako odpoveď na tú Ajax žiadosť. Server vie, čo sa vyžrebovalo a vie to aj návštevník stránky (a nemôže to zmeniť).
Ak chceš použiteľnú radu, budeš musieť prezradiť, čo vlastne chceš dosiahnuť a potom ti pravdepodobne niekto bude vedieť poradiť.
PS: O tom, ako dosiahnuť ukladanie stránky, na ktorej si bol predtým, ti už napísali dosť (a určite by to fungovalo, ak by si od toho naozaj chcel len tú náhradu http referer a nie aj kopec ďalších vecí).
|
|
Registrovaný: 27.06.09 Prihlásený: 16.06.15 Príspevky: 154 Témy: 19 | 19 Bydlisko: Levice, Slo... |
ešte jedna rada...
Kód: ... var xhr = new XMLHttpRequest(); ...
mysli aj na IE, v IE sa ti takto Ajax nespustí, tam je ActiveXObject namiesto XMLHttpRequest
|
|
Registrovaný: 22.01.08 Prihlásený: 19.04.15 Príspevky: 492 Témy: 135 | 135 Bydlisko: Bratislava ... |
neXor píše: ešte jedna rada... Kód: ... var xhr = new XMLHttpRequest(); ... mysli aj na IE, v IE sa ti takto Ajax nespustí, tam je ActiveXObject namiesto XMLHttpRequest
hej ale to by som dopísal neskôr, aj tak je to len pre IE5 a IE6, totiž ja mám IE7 a ajax ide normalne.
|
|
Stránka: 1 z 1
| [ Príspevkov: 15 ] | |
|