Autor | Zpráva | ||
---|---|---|---|
stuchlej Profil |
Dobrý den.
Chci naprogramovat fórum a zlobí mě jedna podmínka v zabezpečovacím sistému. Tato podmínka je vždy vyhodnocena pravdivě. Zde je kód. $n = ahoj taj se jedná o soubor ahoj.txt $p = heslo na prvním řádku dokumentu je napšáno totéž na druhém řádku je text, který dstanete pokud projdete. $f = './'.$n.'.txt'; $kt = fopen($f, "r"); $rk = fgets($kt); if (! $p === $rk){ echo '<font color=red>Chyba ve jméně nebo hesle </font>'.'<a href=index.html>zpět</a>'; exit(); } else{ echo 'ahoj' } $rp = fgets($kt); fclose($kt); Pokud napíšu správné heslo podmínka se vyhodnotí pravdivě. Pokud ale obsah proměné $p změním stejně je podmínka vyhodnocena pravdivě. Poraďte mi prosím. Moderátor Joker: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
|
||
vynalezce Profil |
#2 · Zasláno: 23. 12. 2009, 17:25:49 · Upravil/a: vynalezce
if (! $p === $rk){ co to je (ten ! a 3x =) asi jsi myslel toto if ($p!=$rk){ na radku 14 ti navic chybi strednik za echem |
||
stuchlej Profil |
#3 · Zasláno: 23. 12. 2009, 17:29:59 · Upravil/a: stuchlej
Aha díky. Pokud se to tak nedá použít dost mě to zaráži,protože jsem to již několikrát použil a jelo to.
Nonic díky moc na odpověď Edit: Problém je že nyní se podmínka vždy vyhodnotí nepravdivě. Skoušel jsem i změnit heslo ale pořád to nefunguje |
||
Joker Profil |
#4 · Zasláno: 23. 12. 2009, 17:33:51 · Upravil/a: Joker
stuchlej:
Výraz (! $p === $rk) pravděpodobně dělá něco jiného než si myslíte že dělá. Proměnnou $p to převede na boolean (čili pokud v ní je nějaký řetězec a není to "0", bude výsledkem true) a udělá negaci (čili výsledkem bude nejspíš false) a to se pak porovná s hodnotou proměnné $rk. Kdyby všechno fungovalo správně, podmínka by měla být vždy nepravdivá. Jelikož je vždy pravdivá, pravděpodobně selže čtení ze souboru a fgets vrátí false. Což vzhledem k tomu, že nekontrolujete existenci otevíraného souboru, je možné. Asi chcete místo (! $p === $rk) použít: ($p !== $rk). Dvě poznámky: 1. Mít heslo uložené v čitelné podobě je fuj. 2. Pamatujte, že musíte také řešit situaci, kdy by útočník zjistil přímo adresu souboru a prostě ji zadal do prohlížeče. vynalezce: Pozor, existuje == a === a jejich negace != a !==, což jsou ale různé operátory! |
||
stuchlej Profil |
#5 · Zasláno: 23. 12. 2009, 17:43:45 · Upravil/a: stuchlej
Zkusil jsem oba operatory, změnit heslo a podobně. Vlastně vyzkoušejte celí skcript sami zde je url http://federace.nazory.cz
|
||
vynalezce Profil |
#6 · Zasláno: 23. 12. 2009, 17:55:12 · Upravil/a: vynalezce
Jaká je adresa souboru? Jaké je heslo? Jakou roli v tom má login?
|
||
stuchlej Profil |
#7 · Zasláno: 23. 12. 2009, 18:00:01
http://federace.nazory.cz/stuchlej.txt
Pokud toto napíšete do url zobrazí se i na prvním řádku heslo |
||
vynalezce Profil |
#8 · Zasláno: 23. 12. 2009, 18:02:05
Pošli sem celý kód stránky loader.php.
|
||
stuchlej Profil |
#9 · Zasláno: 23. 12. 2009, 18:20:52
<? session_start(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <meta name="generator" content="PSPad editor, www.pspad.com"> <title>Fórum federace - Přihlášen: <? echo $n = $_POST['name']; ?></title> </head> <body> <body background="bg.jpg"> <div align="center"> <img src="logo.gif"> </div> <br> <table width="1000" bgcolor="#959595" border="0" align="center"> <tr><td> <? $n = $_POST['name']; $_SESSION['name'] = $n; $p = $_POST['pass']; $_SESSION['pass'] = $p; $s = $n.'.txt'; $dir=opendir("./"); while($soubor = readdir($dir)) { if ($soubor == $s) $v = 'sdasdasdad'; } closedir($dir); if (!$v){ echo '<font color=red>Chyba ve jméně nebo hesle </font>'.'<a href=index.html>zpět</a>'; exit(); } $f = './'.$n.'.txt'; $kt = fopen($f, "r"); $rk = fgets($kt); if ($p!=$rk){ echo '<font color=red>Chyba ve jméně nebo hesle </font>'.'<a href=index.html>zpět</a>'; exit(); } else{ echo 'ahoj'; } $rp = fgets($kt); fclose($kt); $_SESSION['sqlp'] = $rp; ?> </table> <br> <table width="1000" align="center" bgcolor="#959595"><tr><td><p align="left">Copyright © 2009</p></td><td><p align="right">MSW Mikoláš Stuchlík</p></td></tr></table> </body> </html> |
||
vynalezce Profil |
#10 · Zasláno: 23. 12. 2009, 18:38:03 · Upravil/a: vynalezce
Nemá být
closedir($dir); až po dokončení cyklu? |
||
stuchlej Profil |
#11 · Zasláno: 23. 12. 2009, 18:47:32
On je po dokončení cyklu
|
||
vynalezce Profil |
#12 · Zasláno: 23. 12. 2009, 18:58:26 · Upravil/a: vynalezce
A jo už to vidím
|
||
stuchlej Profil |
#13 · Zasláno: 23. 12. 2009, 19:08:40
Pokud by to nestačilo jsem ochotný poslat heslo ke stránkám
|
||
vynalezce Profil |
#14 · Zasláno: 23. 12. 2009, 19:10:29 · Upravil/a: vynalezce
Vypisuj v tom cyklu hodnotu proměnné soubor, třeba něco zjistíš
|
||
vynalezce Profil |
#15 · Zasláno: 23. 12. 2009, 19:17:27
Místo toho cyklu, opendir atp. použij funkci
file_exists() |
||
stuchlej Profil |
#16 · Zasláno: 23. 12. 2009, 19:21:05
co je
file _exists(); ? |
||
vynalezce Profil |
#17 · Zasláno: 23. 12. 2009, 19:27:28 · Upravil/a: vynalezce
stuchlej:
co je file _exists(); funkce testujici existenci souboru |
||
stuchlej Profil |
#18 · Zasláno: 23. 12. 2009, 19:49:29
mohu tedy napsat
$soubor = 'ahoj.txt'; if (file_exists($soubor)){ echo 'ok'; } else{ echo 'neexistuje'; } |
||
stuchlej Profil |
#19 · Zasláno: 23. 12. 2009, 20:21:03
Boužel to ale pořád neřeší problém s heslem
|
||
keeehi Profil |
#20 · Zasláno: 23. 12. 2009, 20:54:38 · Upravil/a: keeehi
Nejsem si úplně jist, zda jsem správně pochopil funkci tohoto scriptu, ale přepsal jsem ho tak nějak, jak by snad mohl fungovat.
<? session_start(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <meta name="generator" content="PSPad editor, www.pspad.com">; <title>Fórum federace - Přihlášen: <? echo $n = $_POST['name']; ?></title> </head> <body> <body background="bg.jpg"> <div align="center"> <img src="logo.gif"> </div> <br> <table width="1000" bgcolor="#959595" border="0" align="center"> <tr><td> <? $n = $_POST['name']; $_SESSION['name'] = $n; $p = $_POST['pass']; $_SESSION['pass'] = $p; $soubor = "$n.txt"; if (file_exists($soubor)){ $handle = fopen($soubor, "r"); $obsah = fread($handle, filesize($soubor)); fclose($handle); $obsah=explode("\r\n",$obsah); if($p==$obsah[0]) echo $obsah[1]; else echo '<font color=red>Chyba ve jméně nebo hesle </font>'.'<a href=index.html>zpět</a>'; } else echo 'soubor neexistuje'; $_SESSION['sqlp'] = implode("\r\n",$obsah); ?> </table> <br> <table width="1000" align="center" bgcolor="#959595"><tr><td><p align="left">Copyright 2009</p></td><td><p align="right">MSW Mikoláš Stuchlík</p></td></tr></table> </body> </html> ještě poznámka: = znamená přiřazení; == je porovnávání; === je také porovnávání, ale při tomto porovnávání musí být stejný i datový typ proměnné |
||
Časová prodleva: 14 let
|
0