Hallo tweakers!
Ik ben in bezit van een managed VPS waarop ik ter beschikking stel:
• 1 hoofddomein (www.secret.nl)
• 2 subdomeinen (demo.secret.nl mijn.secret.nl)
Op deze VPS is voor deze domeinen PHP 5.4 actief binnen IIS 6.
Nu heb ik de hostingpartij gevraagd of het mogelijk was om een nodejs module aan te roepen (via PHP), waar zij na wat heen-en-weer e-mailen een constructie aanbieden, waar ik mijn vraagtekens bij zet en deze graag hier wil neerzetten om erachter te komen of deze vraagtekens onterecht zijn!
Achtergrondverhaal:
Het gaat om de module 'uglifyjs' die ik wil gaan gebruiken in combinatie met SACY (Smarty Asset Compiler: een assets manager voor binnen de tempate-engine Smarty).
Omdat de support van de hostingpartij weinig tot geen ervaring hebben met NodeJS installeren op een VPS van hunzelf, heb ik kort uitgezocht hoe NodeJS + bijbehorende modules te installeren op Windows inclusief voorbeeld javascript en voorbeeld php-code die uglifyjs aanroept om de javascript te minifyen.
Het doel van de PHP is het testen van het aanroepen en lezen van de output van uglifyjs, de risico's van exec daargelaten.
Na een opmerking van hun kant over de risico's bij het gebruik van exec heb ik het volgende voorbeeldscript aangeleverd:
Deze code komt ongeveer overeen met de manier die SACY gebruikt bij het aanroepen van externe programma's om bijvoorbeeld javascript te minifyen in dit geval.
Nu komt dan eindelijk het gedeelte waar ik mijn vraagtekens bij zet!
De oplossing van de hostingpartij is het aanroepen van een phpscript die vervolgens een ftp-connectie maakt met localhost, een commando verstuurt en daarna de output uitleest.
Met bijgaande opmerkingen en instructies:
• De software (nodejs + uglify) zijn geïnstalleerd op je server. De executable is via een veilige manier te initiëren. We doen dit via FTP. De taak welke via FTP loopt is op een afgeschermde plek op de server geplaatst. Alleen de FTP server kan/map deze opstarten. Door deze op een niet te bereiken plaats te zetten voorkomen we dat het commando aangepast zou kunnen worden. Eventuele (extra) parameters kunnen we op verzoek wijzigen voor je.
• Zoals afgesproken heb ik in de domeinmap www.secret.nl de mappen (nodejs en npm) geplaatst. In de submap /wwwroot/uglify/ heb ik een PHP script geplaatst hoe het component uglify gebruikt kan worden. Op dit moment kan er alleen een enkele parameter (verplicht) meegegeven worden. Ik heb een extra controle ingebouwd welke controleert of er een parameter is meegegeven. Dit is nodig omdat anders de applicatie blijft draaien op de achtergrond en bij vele simultane acties er problemen kunnen ontstaan
• http://www.secret.nl/uglify/uglify.php?1=c:\domains\secret\wwwroot\uglify\test.js
• In bovenstaande URL word je test.js door uglify gehaald en de output teruggegeven in de browser.
Mijn vraagtekens dan tot slot:
• proc_open of popen wellicht?
• php script met een functie die een voorgedefinieerde proc-call maakt met bepaalde rechten waardoor je als FTP-er het bestand niet kunt bewerken/verwijderen en het proc-commando dus als serverbeheerder als veilig kunt achten?
• of ...
Bevindings?
Ik ben in bezit van een managed VPS waarop ik ter beschikking stel:
• 1 hoofddomein (www.secret.nl)
• 2 subdomeinen (demo.secret.nl mijn.secret.nl)
Op deze VPS is voor deze domeinen PHP 5.4 actief binnen IIS 6.
Nu heb ik de hostingpartij gevraagd of het mogelijk was om een nodejs module aan te roepen (via PHP), waar zij na wat heen-en-weer e-mailen een constructie aanbieden, waar ik mijn vraagtekens bij zet en deze graag hier wil neerzetten om erachter te komen of deze vraagtekens onterecht zijn!
Achtergrondverhaal:
Het gaat om de module 'uglifyjs' die ik wil gaan gebruiken in combinatie met SACY (Smarty Asset Compiler: een assets manager voor binnen de tempate-engine Smarty).
Omdat de support van de hostingpartij weinig tot geen ervaring hebben met NodeJS installeren op een VPS van hunzelf, heb ik kort uitgezocht hoe NodeJS + bijbehorende modules te installeren op Windows inclusief voorbeeld javascript en voorbeeld php-code die uglifyjs aanroept om de javascript te minifyen.
JavaScript:
1
2
| // example javascript to minify to "var a=1,b={c:1,d:2};" var a = 1, b = {c: 1, d: 2,}; |
PHP:
1
2
3
4
| // test calling uglifyjs echo microtime(true) . '<br />'; var_dump(exec('uglifyjs test.js')); echo '<br />'; echo microtime(true) . '<br />'; |
Het doel van de PHP is het testen van het aanroepen en lezen van de output van uglifyjs, de risico's van exec daargelaten.
Na een opmerking van hun kant over de risico's bij het gebruik van exec heb ik het volgende voorbeeldscript aangeleverd:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| echo microtime(true) . '<br />'; $js = file_get_contents('test.js'); $spec = array( 0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w') ); $proc = proc_open('uglifyjs', $spec, $pipes); if(!is_resource($proc)) throw new \Exception("Failed to execute $cmd"); fwrite($pipes[0], $js); fclose($pipes[0]); $out = stream_get_contents($pipes[1]); $err = stream_get_contents($pipes[2]); fclose($pipes[1]); fclose($pipes[2]); $result = proc_close($proc); if ($result != 0){ throw new \Exception("Command returned $result: $err"); } var_dump($out); echo '<br />'; echo microtime(true) . '<br />'; |
Deze code komt ongeveer overeen met de manier die SACY gebruikt bij het aanroepen van externe programma's om bijvoorbeeld javascript te minifyen in dit geval.
Nu komt dan eindelijk het gedeelte waar ik mijn vraagtekens bij zet!
De oplossing van de hostingpartij is het aanroepen van een phpscript die vervolgens een ftp-connectie maakt met localhost, een commando verstuurt en daarna de output uitleest.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| <?php $ftp_server = "127.0.0.1"; $ftp_user_name = "uglify"; $ftp_user_pass = "secret"; $sitecommand = "site UGLIFY ". $_GET["1"]; //echo $sitecommand ."<br>"; //echo $_GET["parameter"] . "<br>"; $conn_id = ftp_connect($ftp_server); $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); ftp_pasv($conn_id, true); $buff = ftp_raw($conn_id, $sitecommand); foreach ($buff as $value) { If ($value != "220 Done.") { echo $value ."<br>"; } } //Alles outputten //var_dump($buff); ftp_close($conn_id); ?> |
Met bijgaande opmerkingen en instructies:
• De software (nodejs + uglify) zijn geïnstalleerd op je server. De executable is via een veilige manier te initiëren. We doen dit via FTP. De taak welke via FTP loopt is op een afgeschermde plek op de server geplaatst. Alleen de FTP server kan/map deze opstarten. Door deze op een niet te bereiken plaats te zetten voorkomen we dat het commando aangepast zou kunnen worden. Eventuele (extra) parameters kunnen we op verzoek wijzigen voor je.
• Zoals afgesproken heb ik in de domeinmap www.secret.nl de mappen (nodejs en npm) geplaatst. In de submap /wwwroot/uglify/ heb ik een PHP script geplaatst hoe het component uglify gebruikt kan worden. Op dit moment kan er alleen een enkele parameter (verplicht) meegegeven worden. Ik heb een extra controle ingebouwd welke controleert of er een parameter is meegegeven. Dit is nodig omdat anders de applicatie blijft draaien op de achtergrond en bij vele simultane acties er problemen kunnen ontstaan
• http://www.secret.nl/uglify/uglify.php?1=c:\domains\secret\wwwroot\uglify\test.js
• In bovenstaande URL word je test.js door uglify gehaald en de output teruggegeven in de browser.
Mijn vraagtekens dan tot slot:
- Is dit gewoonlijk?
- Is proc_open zo onveilig?
- Zal ik ze vragen om een alternatief mogelijk te maken dat geen ftp-connecties (en eventueel aanroepen van urls) vereist?
• proc_open of popen wellicht?
• php script met een functie die een voorgedefinieerde proc-call maakt met bepaalde rechten waardoor je als FTP-er het bestand niet kunt bewerken/verwijderen en het proc-commando dus als serverbeheerder als veilig kunt achten?
• of ...
Bevindings?