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
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
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
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
Zkusil jsem oba operatory, změnit heslo a podobně. Vlastně vyzkoušejte celí skcript sami zde je url http://federace.nazory.cz
vynalezce
Profil
Jaká je adresa souboru? Jaké je heslo? Jakou roli v tom má login?
stuchlej
Profil
http://federace.nazory.cz/stuchlej.txt

Pokud toto napíšete do url zobrazí se i na prvním řádku heslo
vynalezce
Profil
Pošli sem celý kód stránky loader.php.
stuchlej
Profil
<?
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
Nemá být
closedir($dir);
až po dokončení cyklu?
stuchlej
Profil
On je po dokončení cyklu
vynalezce
Profil
A jo už to vidím
stuchlej
Profil
Pokud by to nestačilo jsem ochotný poslat heslo ke stránkám
vynalezce
Profil
Vypisuj v tom cyklu hodnotu proměnné soubor, třeba něco zjistíš
vynalezce
Profil
Místo toho cyklu, opendir atp. použij funkci
file_exists()
stuchlej
Profil
co je
file _exists();

?
vynalezce
Profil
stuchlej:
 co je file _exists();

funkce testujici existenci souboru
stuchlej
Profil
mohu tedy napsat
$soubor = 'ahoj.txt';
if (file_exists($soubor)){
echo 'ok';
}
else{
echo 'neexistuje';
}
stuchlej
Profil
Boužel to ale pořád neřeší problém s heslem
keeehi
Profil
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é

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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