🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #7033

Re: formulario con cgi

#7033
From: J.A. Gutierrez
Date: Fri, 11 Apr 2003 07:38
168 lines
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-mail
References: <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))