Autor | Zpráva | ||
---|---|---|---|
Fastman Profil |
Zdravím,
Mám zde menší problém s foreach, že do exec nevypíše vše. foreach ($_POST['data'] as $data){ echo "zde mam data: $data <br>"; //Funguje, všechno co jsem si navolil, vypíše. exec("cd /test/ && echo \"zde mam data: $data\" > test.cfg "); //V souboru test.cfg se zapíše jenom poslední navolená hodnota. Kde je chyba? } Dále jsem zjistil, že v exec nemůžu použít <br> (echo \"zde mam data: $data\ <br>") pro odřádkování jednotlivých položek, protože se <br> zapíše do test.cfg. Děkuji všem za odpovědi. |
||
Joker Profil |
#2 · Zasláno: 12. 5. 2015, 14:37:54
Fastman:
Ten exec s cyklem funguje úplně normálně, to jen ten prováděný příkaz pokaždé soubor test.cfg přepíše. |
||
Fastman Profil |
Už jsem našel chybu. Problém bylo v > stačí upravit na >> a již to funguje.
|
||
Jan Tvrdík Profil |
#4 · Zasláno: 12. 5. 2015, 16:46:09
Někdo mohl aspoň zmínit, že ten skript je náchylný na RCE zranitelnost.
|
||
Amunak Profil |
Myslím, že ani Jan Tvrdík dostatečně nezdůraznil, jak je ten skript nebezpečný (a zbytečný). Kdokoliv, kdo se k němu dostane, získá přístup k systému, na kterém to běží.
Ten kód je taky neefektivní (zbytečně pořád spouští cd ). Pokud jediné co chceš je zapsat $data do souboru /test/test.cfg , použij něco jako tohle:
foreach ($_POST['data'] as $data){ file_put_contents('/test/test.cfg', $data . PHP_EOL, FILE_APPEND); } nebo lépe v jediném zápise do souboru: file_put_contents('/test/test.cfg', implode(PHP_EOL, $_POST['data']) . PHP_EOL); exec() by se měl používat pouze v případech, kdy je jeho použití nezbytně nutné - typicky spouštění externích programů (technicky vzato přinejmenším cd je vlastně taky externí program, ale klasický zápis do souboru v PHP je podstatně bezpečnější i efektivnější). Navíc bys nad veškerým vstupem co do execu leze měl mít naprostou kontrolu a jistotu, že tam neproleze nic co nemá.
|
||
Časová prodleva: 8 let
|
0