WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Wrapper runt cgi? (https://www.wn.se/forum/showthread.php?t=1050105)

Magnus_A 2011-09-20 07:21

Wrapper runt cgi?
 
Gomorron vänner,
skulle behöva köra ett cgi från en wrapper, som gör vissa checks och modifierar request parametrar, för att sedan skicka ut resultatet till klienten.

Istället för en request som ser ut så här:
http://example.com/cgi-bin/mincgi?re...quest_param2=y

Så vill jag att det ser ut så här:
http://example.com/cgiwrapper.php?re...quest_param2=y

cgiwrapper.php har följande pseudokod:
Citat:

<?php
//gör lite checks
if($_GET['request_param1'] == x){

//lägg till en tredje parameter
$_GET['request_param3'] = z;
}

//Kolla något helt annat , till exempel ingående ip:
if($_SERVER['REMOTE_ADDR'] == '1.2.3.4'){

//gör något

}

// kalla på mitt ursprungliga cgi och returnera resultatet till browsern:
// Här vet jag inte riktigt hur jag ska göra... kanske så här:

echo shell_exec('/usr/lib/cgi-bin/mincgi (ja, hur får jag in requesten $_GET här t ex?)');
Språk: PHP.

Alternativet är naturligtvis att göra ändringarna i cgi-n och kompilera om den, men jag är inte så bra på C.

Tack på förhand

hnn 2011-09-20 08:31

Kod:

<?php

$vars = array();

//gör lite checks
if($_GET['request_param1'] == x)
{
    $vars['param1'] = $_GET['request_param1'];
//    lägg till en tredje parameter
//    $_GET['request_param3'] = z;
    $vars['request_param3'] = z;
}

//Kolla något helt annat , till exempel ingående ip:
if($_SERVER['REMOTE_ADDR'] == '1.2.3.4'){

//gör något

}

$param = '';
foreach($vars as $k => $v)
{
    $param .= ' --' . $k . '='. $v;
}

// kalla på mitt ursprungliga cgi och returnera resultatet till browsern:
// Här vet jag inte riktigt hur jag ska göra... kanske så här:

echo shell_exec('/usr/lib/cgi-bin/mincgi ' . $param);


Något sånt här?

Magnus_A 2011-09-20 09:22

Citat:

Ursprungligen postat av hnn (Inlägg 20418105)
Kod:

<?php

$vars = array();

//gör lite checks
if($_GET['request_param1'] == x)
{
    $vars['param1'] = $_GET['request_param1'];
//    lägg till en tredje parameter
//    $_GET['request_param3'] = z;
    $vars['request_param3'] = z;
}

//Kolla något helt annat , till exempel ingående ip:
if($_SERVER['REMOTE_ADDR'] == '1.2.3.4'){

//gör något

}

$param = '';
foreach($vars as $k => $v)
{
    $param .= ' --' . $k . '='. $v;
}

// kalla på mitt ursprungliga cgi och returnera resultatet till browsern:
// Här vet jag inte riktigt hur jag ska göra... kanske så här:

echo shell_exec('/usr/lib/cgi-bin/mincgi ' . $param);


Något sånt här?

Tack!
Nu var det inte så enkelt för just detta CGI, som inte gillar att initieras annat än från en httpd-server.
Som tur tar cgi:t emot miljövariabler så jag får skriva ett litet bashscript som sätter miljövariabler så att det fungerar.

Först ett phpscript som kallar ett wrapper bashscript som körs som cgi.

Vet inte om jag krånglat till det men det fungerar i alla fall och jag slipper visa upp onödigt mycket variabler i den ursprungliga requesten.

hnn 2011-09-20 09:26

Ok.

Kan ju vara bra o veta.

Magnus_A 2011-09-20 12:50

Citat:

Ursprungligen postat av hnn (Inlägg 20418115)
Ok.

Kan ju vara bra o veta.

Förstår, kom på det först i efterhand att den inte ville låta sig köras direkt från skalet.

Magnus_A 2011-10-06 22:41

Tänkte publicera lösningen här för alla som legat sömnlösa ;)

Eftersom cgi:n inte vill låta sig kallas från skalet så skapade jag ett wrapper som gör checks, lägger till och drar ifrån, och sedan kallar på cgi:n med curl.
Sen skickar jag iväg resultatet genom att sätta en lämplig header, för png i detta fall, samt ekar ut curl-resultatets body.
På det viset kan jag öka säkerheten genom att bara tillåta anrop till cgi:n från localhost, om jag nu är rädd för säkerhetsbrister i cgi:n

Slutet gott, allting gott.


Alla tider är GMT +2. Klockan är nu 16:17.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson