Article View: es.comp.os.linux.programacion
Article #7033Re: formulario con cgi
From: J.A. Gutierrez
Date: Fri, 11 Apr 2003 07:38
Date: Fri, 11 Apr 2003 07:38
168 lines
5029 bytes
5029 bytes
Mainake <mainake@escomposlinux.org> wrote:
: -----BEGIN PGP SIGNED MESSAGE-----
: Hash: SHA1
: El Thu, 10 Apr 2003 19:04:09 +0200, Natxo
: expon�a en su mensaje:
:> Ahora bien, si creo una p�gina web con un formulario e intento enlazar
:> las dos cosas, se fastidi� el invento. Este es el c�digo que he probado:
:>
:> introduzca una palabra para buscar su significado en ingl�s:
:><form action="http://localhost/cgi-bin/script" method="POST">
:><input size=40 name=q VALUE=""></form>
:>
: No se si sera una chapuza, pero si a ese formulario le a�ades un boton
: de envio y en el script cambias la linea de argument, por
: argument=`echo $QUERY_STRING | awk -F = '{ print $2 }'`
por lo general, es muy poco recomendable programar CGI's en
shell, especialmente si no tienes experiencia en programacion
segura.
Un ejemplo de CGI en sh que funciona tanto para POST como para
GET (pero que no garantizo que sea seguro):
---------------------------------------------------------------------------
#!/bin/sh -
#
# (c) SPDsoft December 12, 1995
#
set -f
ulimit -f 0
# Uncomment these if your /bin/sh understand them.
#ulimit -c 0
#ulimit -d 8192
#ulimit -t 60
#ulimit -v 8192
#ulimit -m 8192
USE_CGIPARSE=:
#USE_CGIPARSE=false
CGIPARSE="/users/server/www/usr/aux-bin/cgiparse"
CAT=/bin/cat
HEAD=/usr/bin/head
ECHO=/bin/echo
AWK=/usr/bin/awk
MD5=/usr/local/bin/md5
SED=/bin/sed
$ECHO Content-type: text/html
$ECHO
$CAT << EOM
<HTML>
<HEAD>
<title>test</title>
</HEAD>
<BODY>
<H1>
Test
</H1>
<BR>
<HR>
<PRE>
EOM
id
env
$ECHO '<HR>'
if [ "_${QUERY_STRING}_" = "__" ]
then
read QUERY_STRING
$ECHO '<HR>'
$ECHO "POST QUERY_STRING=\"$QUERY_STRING\""
$ECHO '<HR>'
REQUEST_METHOD=GET
export REQUEST_METHOD
export QUERY_STRING
fi
if $USE_CGIPARSE
then
for var in foo bar
do
value="`$CGIPARSE -1 -value $var 2>&1`"
case $? in
0)
value=`echo "$value" | tr -d '[\001-\037]"\`#;\117'`
#eval "$var=\"$value\""
$ECHO "$var" = \""$value"\" "<BR>"
;;
*)
$ECHO "Error: Incorrect URL ( $var )( $? )<br><br>"
;;
esac
done
else
OFIFS="$IFS"
IFS="&"
for field in $QUERY_STRING
do
var=`echo $field | awk -F= '{print $1}'`
value=`echo $field | sed -e "s/^${var}=//" -e "s/+/ /g"`
$ECHO "$var" = \""$value"\" "<BR>"
done
$ECHO '<HR>'
IFS="$OIFS"
fi
$ECHO '<HR>'
$CAT << EOM
</PRE>
<BR>
<HR>
</BODY>
</HTML>
EOM
---------------------------------------------------------------------------
En el ejemplo se utiliza el programa auxiliar "cgiparse",
que creo recordar que venia con el codigo fuente del servidor
http de NCSA; si no, ver la implementacion alternativa usando
el bucle "for" comentado.
Aunque faltaria la decodificacion de tipo "%20" -> " ". Dicha
decodificacion podria hacerse o bien en perl trivialmente, o
usando un programa auxiliar externo tipo "htd":
- htd.c -------------------------------------------------------------------
#include <stdio.h>
#include <ctype.h>
#define ctoi(c) ( (c) <= '9' ? (c)-'0' : (c) - 'a' + 10)
main()
{
unsigned char c,d;
for( c=getchar(); (!feof(stdin)); c=getchar())
{
if ( c=='%' )
{
d=getchar();
if ( isxdigit(d) )
{
d=tolower(d);
c=(unsigned char)(16*ctoi(d));
d=tolower(getchar());
c+=(unsigned char)(ctoi(d));
}
else
c=d;
}
putchar(c);
}
}
---------------------------------------------------------------------------
--
finger spd@shiva.cps.unizar.es for PGP /
.mailcap tip of the day: / La vida es una carcel
application/ms-tnef; cat '%s' > /dev/null / con las puertas abiertas
text/x-vcard; cat '%s' > /dev/null / (A. Calamaro)
Technical Details
Message-ID:
<b75rdn$b8e$1@localhost.escomposlinux.org>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!cyclone.bc.net!newsfeed.telusplanet.net!rip!news.webusenet.com!cox.net!news-hub.cableinet.net!blueyonder!marmolejo.escomposlinux.org!not-for-mailReferences:
<slrnb9b908.g6p.natxo@tux.copon.net> <slrnb9bfrk.43h.mainake@atolon.linux.es>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: f86c8,bdd8dc4e71351cde
X-Google-Attributes: gidf86c8,public
X-Google-ArrivalTime: 2003-04-11 00:38:33 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!cyclone.bc.net!newsfeed.telusplanet.net!rip!news.webusenet.com!cox.net!news-hub.cableinet.net!blueyonder!marmolejo.escomposlinux.org!not-for-mail
From: "J.A. Gutierrez" <spd@daphne.cps.unizar.es>
Newsgroups: es.comp.os.linux.programacion
Subject: Re: formulario con cgi
Date: Fri, 11 Apr 2003 07:38:31 +0000 (UTC)
Organization: Rank
Lines: 168
Sender: "J.A. Gutierrez" <spd@shiva.cps.unizar.es>
Message-ID: <b75rdn$b8e$1@localhost.escomposlinux.org>
References: <slrnb9b908.g6p.natxo@tux.copon.net> <slrnb9bfrk.43h.mainake@atolon.linux.es>
NNTP-Posting-Host: shiva.cps.unizar.es
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
X-Trace: localhost.escomposlinux.org 1050046711 11534 155.210.152.10 (11 Apr 2003 07:38:31 GMT)
X-Complaints-To: newsmaster@marmolejo.escomposlinux.org
NNTP-Posting-Date: Fri, 11 Apr 2003 07:38:31 +0000 (UTC)
User-Agent: tin/1.4.7-20030322 ("Suggestions") (UNIX) (IRIX64/6.2 (IP19))