Autor Zpráva
Yuff.3
Profil
Ahojte,
prosím Vás o skontrolovanie kódu z hľadiska bezpečnosti a správnosti:
<?php
$ftp_server = "";
$ftp_user = "";
$ftp_pass = "";
$cesta = "ftp://$ftp_user:$ftp_pass@$ftp_server:21/pokus.php";

$conn_id = ftp_connect($ftp_server) or die("Nie je možné pripojiť k: $ftp_server");

if (@ftp_login($conn_id, $ftp_user, $ftp_pass)) {

if (file_exists($cesta)) {

$myfile = fopen("$cesta", "r") or die("Nie je možné otvoriť!");
while(!feof($myfile)) {

  htmlspecialchars($string) = fgets($myfile);

$ip = substr($string, 0, strpos($string, " "));
$datum = substr($string, strpos($string, " ")+2, 8);
$cas = substr($string, strpos($string, "| ")+2, 8);
$nick = substr($string, strpos($string, "] ")+2, (strpos($string, " -")-strpos($string, "] ")-2) );
$dovod = substr($string, strpos($string, "- ")+2);

echo"<table align='center'>
  <tr>
    <td>
      Ip adresa:
    </td>
    <td>
      Dátum:
    </td>
    <td>
      Čas:
    </td>
    <td>
      Nick:
    </td>
    <td>
      Dôvod:
    </td>
  </tr>
  
  <tr>
    <td>
      ".$ip."
    </td>
    <td>
      ".$datum."
    </td>
    <td>
      ".$cas."
    </td>
    <td>
      ".$nick."
    </td>
    <td>
      ".$dovod."
    </td>
  </tr>
</table>";

}
fclose($myfile);

ftp_close($conn_id);

} else {
    echo "Nepripojené k FTP<br />";
}
} else {
echo "Súbor sa nenašiel<br />";
}
?>
Keeehi
Profil
První problém je už použití samotného ftp které je nezabezpečené. Takže soubory může po cestě kdokoli číst a nebo je i modifikovat.
I když se nepodaří na řádku 9 přihlásit, script i po vypsání chyby na řádku 11 přesto pokračuje. (Irituje mě ten prázdný true blok ale to je vedlejší)
To samé se opakuje na řádu 15.
A pak do stránky bez jakéhokoli ošetření vypisuješ data z "neznámého" zdroje. I když ten soubor na tom ftp třeba patří tobě, jsi si na 100% jistý, že nad ním máš úplnou kontrolu? Já bych si nebyl. Jak jsem psal na začátku, po cestě ti ho může někdo modifikovat. Také pokud bude dané ftp nějak napadeno, automaticky může být napadený i tvůj systém. Takže veškeré proměnné vypisované do stránky ošetři pomocí htmlspecialchars.

- Čekal bych, že jednotlivé řádky budeš vypisovat do tabulky a ne že budeš každému tvořit samostatnou tabulku. Ale to už není o bezpečnosti.
Yuff.3
Profil
Keeehi:
- Čekal bych, že jednotlivé řádky budeš vypisovat do tabulky a ne že budeš každému tvořit samostatnou tabulku. Ale to už není o bezpečnosti.
jasné, to som robil na rýchlo, preto som sa s tým nezaoberal. Samozrejme to bude vyzerať v konečnom dôsledku trochu dosť ináč.

Dúfam, že editovaný kód v #1 je už aspoň z časti správne. Opravil som tie podmienky (ktoré ťa iritovali)..
Jak môže niekto modifikovať ten súbor po ceste?
Ošetriť htmlspecialchars ? klikol som na tú funkciu a snažil som sa ju naštudovať - pre príklad mojho "(ne)pochopenie" pozri riadok 13 - je to takto správne? Stačí ošetrenie tohto riadku? Viem, písal si „veškeré proměnné vypisované do stránky“, ale ostatné premenné existujú vďaka tejto základnej - nestačí teda logicky "zakódovať" túto?
Moc krát ďakujem.
lionel messi
Profil
Yuff.3:
pre príklad mojho "(ne)pochopenie" pozri riadok 13 - je to takto správne?
V žiadnom prípade. Funkcia fopen nikdy nevracia reťazec a už vôbec nie užívateľský vstup. Keď chceš ošetrenie spraviť na jednom mieste, ošetri premennú $string.
Yuff.3
Profil
lionel messi:
myslíš takto? Je ten zápis správny?
A čo ten zbytok, môže to tak byť?
lionel messi
Profil
Yuff.3:
Je ten zápis správny?
Nie. Použi toto:

$string = htmlspecialchars(fgets($myfile));

A čo ten zbytok, môže to tak byť?
Bezpečnosť je chúlostivá záležitosť, nerád by som ťa naviedol na zlú cestu, preto radšej nechám vyjadriť sa skúsenejších kolegov.
Yuff.3
Profil
lionel messi:
ďakujem pekne. vyjadriť sa ale môžeš.
Keeehi
Profil
lionel messi:
Ani ten $string není úplně správně.

Mělo by to být až při výpise
    "<td>
      ".htmlspecialchars($ip)."
    </td>"
Yuff.3
Profil
Keeehi:
->
Yuff.3:
Viem, písal si ‚veškeré proměnné vypisované do stránky‘, ale ostatné premenné existujú vďaka tejto základnej - nestačí teda logicky "zakódovať" túto?
Keeehi
Profil
Yuff.3:
V některých případech by to bylo možné. Ovšem když se s tím řetězcem dále pracuje, může se stát, že se do něj zase nějaká bezpečnostní díra dostane. Proto je best practice to ošetřovat až těsně před výstupem.
Jan Tvrdík
Profil
Yuff.3:
Mimochodem na stažení jednoho souboru stačí otevřít jedno FTP připojení, ty momentálně otevíráš spojení tři.
Kubo2
Profil
Yuff.3:
Viem, písal si »veškeré proměnné vypisované do stránky«, ale ostatné premenné existujú vďaka tejto základnej - nestačí teda logicky "zakódovať" túto?

Nestačí (a dokonca to v tomto prípade, keď máš ako zdroj dát resource, hneď na začiatku ani nejde). Viď [#4].
Yuff.3
Profil
Aha dobre, rozumiem. Ďakujem za vysvetlenie.

Jan Tvrdík:
Mimochodem na stažení jednoho souboru stačí otevřít jedno FTP připojení, ty momentálně otevíráš spojení tři.
Aké tri? Kde? Asi nerozumiem..
(Zatiaľ otváram len súbor pokus.php, ale budem otvárať aj pokus2.php. Ešte neviem či v tomto istom scripte ale pravdepodobne áno..)
Ako to však upravím ten kód aby mi otváral len potrebný jeden (prípadne 2) krát?
lionel messi
Profil
Yuff.3:
Aké tri? Kde? Asi nerozumiem..
Jan Tvrdík má pravdu.

1. spojenie = riadok 7
2. spojenie = r. 9
3. spojenie = r. 10
Jan Tvrdík
Profil
Yuff.3:
Aké tri? Kde? Asi nerozumiem..
Funkce ftp_connect, file_exists a fopen si každá otevřou nové spojení. Spojení z ftp_connect otevřeš a na nic nepoužiješ, další použiješ na ověření existence souboru a třetím ty data stáhneš. Reálně by ti přitom mělo stačit $lines = file($cesta) a ověřit návratovou hodnotu.
Yuff.3
Profil
Skúsil som teda upraviť ten kód. Viď.
<?php
$ftp_server = "";
$ftp_user = "";
$ftp_pass = "";
$cesta = "ftp://$ftp_user:$ftp_pass@$ftp_server:21/cstrike/addons/listip.cfg";

echo"<table style='border: 1px solid;' width='100%' align='center'>
  <tr align='center'>
    <td style='border: 1px solid;'>
      Ip adresa:
    </td>
    <td style='border: 1px solid;'>
      Dátum:
    </td>
    <td style='border: 1px solid;'>
      Čas:
    </td>
    <td style='border: 1px solid;'>
      Nick:
    </td>
    <td style='border: 1px solid;'>
      Dôvod:
    </td>
  </tr>";
echo "<tr align='center'><td><br/></td></tr>";

$myfile = fopen("$cesta", "r") or die("Nie je možné otvoriť BAN list!");
while(!feof($myfile)) {

  $string = fgets($myfile);

$ip = substr($string, 0, strpos($string, " "));
$datum = substr($string, strpos($string, " ")+2, 8);
$cas = substr($string, strpos($string, "| ")+2, 8);
$nick = substr($string, strpos($string, "] ")+2, (strpos($string, " -")-strpos($string, "] ")-2) );
$dovod = substr($string, strpos($string, "- ")+2);

echo"<tr align='center'>
    <td>
      ".htmlspecialchars($ip)."
    </td>
    <td>
      ".htmlspecialchars($datum)."
    </td>
    <td>
      ".htmlspecialchars($cas)."
    </td>
    <td>
      ".htmlspecialchars($nick)."
    </td>
    <td>
      ".htmlspecialchars($dovod)."
    </td>
  </tr>";
echo "<tr align='center'><td><br/></td></tr>";

}
echo"</table>";

fclose($myfile);
?>
Je to takto v poriadku? Nie je tam už nič naviac? Z hľadiska bezpečnosti je v poriadku používať to takto?
Keeehi
Profil
Na konci jsi zapomněl ftp_close ale jinak to vypadá dobře.
Yuff.3
Profil
Keeehi:
Už som ho zmazal..
Ďakujem.

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:

0