[PHP] NodeJS module aanroepen op een Managed VPS

Pagina: 1
Acties:

Onderwerpen


  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 26-08 22:21
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.


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?
Alternatieven die ik zo kan bedenken, zonder dat ik heb bedacht of ze kunnen gaan werken:
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?

:D

Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 12-09 11:48
Ik snap niet zo goed wat het probleem is van een commando aanroepen. Als je de input voor dit commando goed controleert, dan zijn de risico's volgens mij zeer beperkt. Dan moet het PHP-script aangepast worden om wat kwaad te doen. En als je die rechten hebt verworven, kun je alles doen.

In mijn ogen is het vooral erg omslachtig.

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 26-08 22:21
storeman schreef op vrijdag 16 augustus 2013 @ 09:44:
Ik snap niet zo goed wat het probleem is van een commando aanroepen. Als je de input voor dit commando goed controleert, dan zijn de risico's volgens mij zeer beperkt. Dan moet het PHP-script aangepast worden om wat kwaad te doen. En als je die rechten hebt verworven, kun je alles doen.

In mijn ogen is het vooral erg omslachtig.
Ik heb als gebruiker van de VPS alle rechten tot mijn eigen PHP-scripts waarin ik een commando zou willen aanroepen. De hostingpartij kan niet garanderen dat ik niet een commando aanroep waarvan dit niet de bedoeling is.

Als er dus een script beschikbaar wordt gesteld die uglifyjs aanroept waarvan ik de rechten niet heb om aan te passen, maar wel de rechten heb om een functie uit dit bestand aan te roepen lijkt mij dat er geen risico is? Of zijn daar toch wel risico's aan verbonden?

Acties:
  • 0 Henk 'm!

  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
Ik begrijp niet waarom je een NodeJS script aanroept vanuit PHP?

Om je probleem op te lossen zou ik een andere hoster zoeken, een hoster die FTP niet als beveiligingsmaatregel voorstelt.

[ Voor 19% gewijzigd door -DarkShadow- op 16-08-2013 10:51 ]

Specialist in:
Soldeerstations
Oscilloscoop


Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 12-09 11:48
C0rnelis schreef op vrijdag 16 augustus 2013 @ 10:43:
[...]


Ik heb als gebruiker van de VPS alle rechten tot mijn eigen PHP-scripts waarin ik een commando zou willen aanroepen. De hostingpartij kan niet garanderen dat ik niet een commando aanroep waarvan dit niet de bedoeling is.

Als er dus een script beschikbaar wordt gesteld die uglifyjs aanroept waarvan ik de rechten niet heb om aan te passen, maar wel de rechten heb om een functie uit dit bestand aan te roepen lijkt mij dat er geen risico is? Of zijn daar toch wel risico's aan verbonden?
Als gebruiker van een VPS heb je alle rechten om alles te doen. Inclusief programma's installeren zoals NodeJS. Het voordeel is dus dat je allerlei software kan gebruiken die bij shared hosting niet ondersteund wordt. Je hebt dus alle vrijheid, en inderdaad ook de vrijheid om je server om zeep te helpen. De enige die hier last van heeft, ben jij zelf. Dat de hoster hier niets over kan garanderen, kan ik me voorstellen. Jij hebt die VPS voor die vrijheid, als je die gebruikt, ben je zelf verantwoordelijk.

De hoster kan dit waarschijnlijk nu ook niet garanderen. Hoeveel ervaring heb je hiermee en met PHP? Ik begin het idee te krijgen dat je niet helemaal weet waar je mee bezig bent, en daarom dat advies van de hoster nodig hebt. Als dat zo is, dan is het misschien wel verstandig om het op de voorgestelde manier te doen. Je kunt natuurlijk ook iemand anders inschakelen om een goed script te maken.

Overigens zie ik geen bezwaar in het direct aanroepen van externe programma's. Daar zijn die commando's voor bedoeld. Het gevaar is dat die commando's gemanipuleerd kunnen worden door user input. En dan liggen al je gegevens wel op straat/gaat de server hele andere dingen doen/...

Je moet gewoon zeker weten dat je commando alleen uit kan voeren, wat het zou mogen. Dan is er volgens mij geen sprake van veiligheidsissues.

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 26-08 22:21
storeman schreef op vrijdag 16 augustus 2013 @ 11:06:
[...]


Als gebruiker van een VPS heb je alle rechten om alles te doen. Inclusief programma's installeren zoals NodeJS. Het voordeel is dus dat je allerlei software kan gebruiken die bij shared hosting niet ondersteund wordt. Je hebt dus alle vrijheid, en inderdaad ook de vrijheid om je server om zeep te helpen. De enige die hier last van heeft, ben jij zelf. Dat de hoster hier niets over kan garanderen, kan ik me voorstellen. Jij hebt die VPS voor die vrijheid, als je die gebruikt, ben je zelf verantwoordelijk.

De hoster kan dit waarschijnlijk nu ook niet garanderen. Hoeveel ervaring heb je hiermee en met PHP? Ik begin het idee te krijgen dat je niet helemaal weet waar je mee bezig bent, en daarom dat advies van de hoster nodig hebt. Als dat zo is, dan is het misschien wel verstandig om het op de voorgestelde manier te doen. Je kunt natuurlijk ook iemand anders inschakelen om een goed script te maken.

Overigens zie ik geen bezwaar in het direct aanroepen van externe programma's. Daar zijn die commando's voor bedoeld. Het gevaar is dat die commando's gemanipuleerd kunnen worden door user input. En dan liggen al je gegevens wel op straat/gaat de server hele andere dingen doen/...

Je moet gewoon zeker weten dat je commando alleen uit kan voeren, wat het zou mogen. Dan is er volgens mij geen sprake van veiligheidsissues.
Voor een VPS heb je gelijk, het verschil zit 'm in dat het in dit geval om een managed VPS gaat en zij proberen te voorkomen dat ik op de VPS potentiele onveilige commando's kan uitvoeren. Want als een generieke klant (ik) het voor elkaar krijg om een managed VPS onbruikbaar te maken (door het uitvoeren van welk commando dan ook), dan moeten zij bij wijze van dat zelf gaan herstellen.
-DarkShadow- schreef op vrijdag 16 augustus 2013 @ 10:49:
Ik begrijp niet waarom je een NodeJS script aanroept vanuit PHP?
Om uglifyjs als minifier te kunnen gebruiken aangezien ik geen toegang heb tot een terminal waarbij ik de commando's handmatig kan invoeren. Het alternatief is daardoor een commando uitvoeren via PHP.

[ Voor 9% gewijzigd door C0rnelis op 16-08-2013 13:26 ]


Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 12-09 14:10
Waarom heb je geen shell toegang tot je VPS Server? SSH toegang lijkt me toch wel handig bij een VPS.

Daarnaast, misschien heb je iets aan https://github.com/kriswallsmith/assetic
Dat is speciaal gemaakt voor dit soort dingen, inclusief standaard filters voor Uglify via Node.

Via FTP verbinden om commando's uit te voeren lijkt me een beetje raar zo. En je knalt de inhoud van $_GET['1'] nu rechtstreeks als commando de FTP op, lijkt me ook niet erg veilig.

Acties:
  • 0 Henk 'm!

  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 26-08 22:21
Barryvdh schreef op vrijdag 16 augustus 2013 @ 14:02:
Waarom heb je geen shell toegang tot je VPS Server? SSH toegang lijkt me toch wel handig bij een VPS.

Daarnaast, misschien heb je iets aan https://github.com/kriswallsmith/assetic
Dat is speciaal gemaakt voor dit soort dingen, inclusief standaard filters voor Uglify via Node.

Via FTP verbinden om commando's uit te voeren lijkt me een beetje raar zo. En je knalt de inhoud van $_GET['1'] nu rechtstreeks als commando de FTP op, lijkt me ook niet erg veilig.
Lijkt mij ook handig in veel gevallen, maar hoe (on)gewoonlijk is shell toegang eigenlijk bij een managed VPS?

Ik weet niet genoeg van FTP configuraties/setups om te zeggen of het wel of niet mogelijk is, maar misschien dat die gebruiker maar 1 commando kan uitvoeren? Als dat zo is en de arguments worden netjes afgevangen aan de serverkant lijkt me daar geen risico in te zitten?

Assetic ken ik ook en was mijn eerste keuze, maar door onbekende oorzaken kreeg ik dit niet zo snel aan de praat. SACY daarentegen werkte bijna onmiddelijk en heeft ook ondersteuning voor Uglifyjs, maar heeft dit wel nodig op de server.

Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 12-09 11:48
Volgens mij is het grootste verschil tussen managed en unmanaged, het feit dat updates en dergelijke worden geinstalleerd voor je. Als je inderdaad een bepaalde stabiliteitsgarantie wilt, dan zou ik als hoster ook geen risico's nemen. Dit is voor hen waarschijnlijk geen dagelijkse kost.

Je kunt natuurlijk zelf het risico nemen om het op een andere manier te doen. Ik zeg niet dat dit een groot risico is, maar dan haal je het tenminste bij de hoster weg. Die heeft hier gewoon te weinig kennis van, en de markt om hier wel kennis van te hebben is dermate klein, dat je dit gewoonweg niet voor een lage prijs kunt verwachten.

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 12-09 14:10
Het idee van een VPS is toch dat je eigen baas bent over je installatie, aangezien jij virtueel een eigen server hebt? Ik heb op mijn VPS' wel gewoon SSH toegang (maar dat is Linux, dus misschien anders). Ook lijkt het me vooral een risico voor jezelf, als jij perse iets wil draaien/installeren kan dat, maar als zij het moeten oplossen kan je er voor betalen (of gewoon opnieuw installeren)

Anyways, ik werk niet met Windows servers, maar ik het laatst toevallig NodeJS geïnstalleerd op mijn Centos VPS om Less aan de praat te krijgen (met Assetic), maar dat werkte gewoon, zonder rare FTP commando's..

Acties:
  • 0 Henk 'm!

  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
C0rnelis schreef op vrijdag 16 augustus 2013 @ 13:24:
Om uglifyjs als minifier te kunnen gebruiken aangezien ik geen toegang heb tot een terminal waarbij ik de commando's handmatig kan invoeren. Het alternatief is daardoor een commando uitvoeren via PHP.
Is er een reden om uglifyjs als minifier te gebruiken? Er zijn genoeg goede minifiers beschikbaar voor PHP. Ik kan geen enkele reden bedenken om NodeJS te installeren (en onderhouden) om JS te minifyen.

Specialist in:
Soldeerstations
Oscilloscoop


Acties:
  • 0 Henk 'm!

  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 26-08 22:21
-DarkShadow- schreef op vrijdag 16 augustus 2013 @ 18:14:
[...]

Is er een reden om uglifyjs als minifier te gebruiken? Er zijn genoeg goede minifiers beschikbaar voor PHP. Ik kan geen enkele reden bedenken om NodeJS te installeren (en onderhouden) om JS te minifyen.
Het is geen harde eis, maar bleek makkelijk te integreren in de gebruikte tooling.
Barryvdh schreef op vrijdag 16 augustus 2013 @ 18:01:
Het idee van een VPS is toch dat je eigen baas bent over je installatie, aangezien jij virtueel een eigen server hebt? Ik heb op mijn VPS' wel gewoon SSH toegang (maar dat is Linux, dus misschien anders). Ook lijkt het me vooral een risico voor jezelf, als jij perse iets wil draaien/installeren kan dat, maar als zij het moeten oplossen kan je er voor betalen (of gewoon opnieuw installeren)

Anyways, ik werk niet met Windows servers, maar ik het laatst toevallig NodeJS geïnstalleerd op mijn Centos VPS om Less aan de praat te krijgen (met Assetic), maar dat werkte gewoon, zonder rare FTP commando's..
Ik heb persoonlijk geen ervaring met andere VPS-en (managed en niet-managed), maar in dit geval betekent managed VPS dat ik via een webinterface eigenlijk hosting kan gaan resellen en standaard dus de VPS voor eigen domein volledig in gebruik kan nemen. Wat ik naast hostingpakketten (wat bestaat uit gebruikers, en limieten instellen voor te gebruiken software, database- en emailboxlimieten etcetera) kan configureren zijn PHP-versies en configuraties, ASP activeren, sql-databases, email + webmail beheren en domeinen kan parkeren (etcetera, maar niets op het vlak van shell-toegang, eigen software installeren die meer vereist dan het uploaden van bestanden (zoals NodeJS) en updates installeren etc. Het managen van de server ligt dus compleet bij de managed VPS-hostingpartij en hieronder valt dus ook het (op verzoek) installeren van niet-standaard-voorgeinstalleerde software. De betaling voor dat soort werk/support zit dus ook in het verschil dat je betaalt per maand. Het idee is dus meer dat je je resources niet hoeft te delen t.o.v. shared webhosting, zonder dat je alles zelf moet installeren, configureren en (security-)updates moet bijwerken. Wanneer ik een niet-managed VPS zou hebben afgenomen krijg je gewoon toegang tot vSphere en moet je je maar redden.

[ Voor 70% gewijzigd door C0rnelis op 16-08-2013 18:48 ]


Acties:
  • 0 Henk 'm!

  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
C0rnelis schreef op vrijdag 16 augustus 2013 @ 18:36:
[...]


Het is geen harde eis, maar bleek makkelijk te integreren in de gebruikte tooling.
Blijkt dat vies tegen te vallen :P

Specialist in:
Soldeerstations
Oscilloscoop


Acties:
  • 0 Henk 'm!

  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 26-08 22:21
-DarkShadow- schreef op vrijdag 16 augustus 2013 @ 19:31:
[...]

Blijkt dat vies tegen te vallen :P
Het is maar hoe je het bekijkt, aan de tooling zelf ligt het niet.. :9

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
C0rnelis schreef op vrijdag 16 augustus 2013 @ 14:51:
[...]
Assetic ken ik ook en was mijn eerste keuze, maar door onbekende oorzaken kreeg ik dit niet zo snel aan de praat. SACY daarentegen werkte bijna onmiddelijk en heeft ook ondersteuning voor Uglifyjs, maar heeft dit wel nodig op de server.
Wat was het probleem met Assetic dan?

Overigens wel apart... heb je een VPS met alle vrijheid, zit er nog iemand tegen je te zeuren dat je dingen op een bepaalde manier moet doen. Jouw VPS, jouw software, jouw regels :)

Acties:
  • 0 Henk 'm!

  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 26-08 22:21
Cartman! schreef op vrijdag 16 augustus 2013 @ 20:39:
[...]

Wat was het probleem met Assetic dan?

Overigens wel apart... heb je een VPS met alle vrijheid, zit er nog iemand tegen je te zeuren dat je dingen op een bepaalde manier moet doen. Jouw VPS, jouw software, jouw regels :)
Ik kreeg het simpelweg niet aan de praat. Als ik het mij goed herinner werden of filenames gegenereerd zonder extensies met (volgens mij) de AssetFactory, of er werden succesvol bestanden weggeschreven met de AssetWriter, maar ik kreeg op geen enkele manier dezelfde filenames gegenereerd op de plek waar ik mijn assets wilde outputten in de html. Qua documentatie en uitgebreide tutorials her en der op het internet was ik erg teleurgesteld over hoe het tot in de puntjes is te gebruiken buiten Symfony2 of Yii en zonder Twig. Wat ik namelijk wilde is dit concept aan de praat te krijgen: https://github.com/kriswa.../master/docs/en/define.md

Wat ik zoek is namelijk (eventueel geintegreerd in Smarty) een php assetmanager die css/js minified + concat + versioning toepast door middel van de bestandsnamen, en dit het liefst automatisch doet (dus als ik een asset aanpas dat bij de volgende request een nieuwe static file is gegenereerd die deze changes bevat. SACY doet dit heel goed en werkte direct, maar gebruikt een php-port van JSMin en deze struikelt bij het minifyen over jQuery UI sinds versie 1.9. , mijn oplossing was om uglifyjs te gebruiken (dit is in te stellen met SACY) en dit werkte direct lokaal op de ontwikkelomgeving. De volgende stap is dit ook te gebruiken op de productieomgeving en na een tijdje komen we dus uit op de eerste post van deze thread.
Pagina: 1