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 |
#2 · Zasláno: 9. 2. 2015, 20:10:30
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 |
#3 · Zasláno: 9. 2. 2015, 20:52:06
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 |
#4 · Zasláno: 9. 2. 2015, 20:56:40
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 |
#5 · Zasláno: 9. 2. 2015, 21:00:26
lionel messi:
myslíš takto? Je ten zápis správny? A čo ten zbytok, môže to tak byť? |
||
lionel messi Profil |
#6 · Zasláno: 9. 2. 2015, 21:02:35
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 |
#7 · Zasláno: 9. 2. 2015, 21:06:27
lionel messi:
ďakujem pekne. vyjadriť sa ale môžeš. |
||
Keeehi Profil |
#8 · Zasláno: 9. 2. 2015, 21:14:51
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 |
#9 · Zasláno: 9. 2. 2015, 21:22:06
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 |
#10 · Zasláno: 9. 2. 2015, 21:26:32
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 |
#11 · Zasláno: 9. 2. 2015, 21:28:20
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 |
#13 · Zasláno: 9. 2. 2015, 21:36:40
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 |
#14 · Zasláno: 9. 2. 2015, 21:39:15
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); ?> |
||
Keeehi Profil |
Na konci jsi zapomněl ftp_close ale jinak to vypadá dobře.
|
||
Yuff.3 Profil |
#18 · Zasláno: 10. 2. 2015, 17:01:30
Keeehi:
Už som ho zmazal.. Ďakujem. |
||
Časová prodleva: 10 let
|
0