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
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
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á.

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: