Foros del Web » Programando para Internet » PHP »

Ayuda con superglobals, por favor

Estas en el tema de Ayuda con superglobals, por favor en el foro de PHP en Foros del Web. Bueno, hacia muchos años que no programaba (Lo ultimo VB 6.0) pero por compromiso de amistad me he tenido que meter a hacer un website. ...
  #1 (permalink)  
Antiguo 19/11/2006, 14:24
 
Fecha de Ingreso: noviembre-2006
Mensajes: 4
Antigüedad: 17 años, 5 meses
Puntos: 0
Ayuda con superglobals, por favor

Bueno, hacia muchos años que no programaba (Lo ultimo VB 6.0) pero por compromiso de amistad me he tenido que meter a hacer un website.

Normalmente usaba FrontPage para hacer sencillos sites y he continuado con lo mismo. Mi servidor actual soporta las extensiones FP, pero no el envio de formularios con el webbot de FP y me han sugerido que utilice PHP.

Bien, mi problema es el siguiente: He hecho con FP un formulario, cuyos resultados quiero mandarmelos por e-mail. Para ello he utilizado "PhpMailer" (Una biblioteca ya configurada para envio de mails).

Todo funciona a la perfeccion, pero la variable $_REQUEST que pasa desde el formulario al php llega vacia.

Primero utilice $_POST, pero el resultado era el mismo.

He testeado "echo nl2br(print_r ($_REQUEST, true))" y el resultado en pantalla es simplemente "Array( )".

Brevemente mi codigo en Htm es:

Cita:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>SOLICITUD</title>
</head>

<body>


<? require ('class.phpmailer.php'); # <--- Carga la biblioteca de phpmailer ?>


<!--webbot BOT="GeneratedScript" PREVIEW=" " startspan --><script Language="JavaScript" Type="text/javascript"><!--
function FrontPage_Form1_Validator(theForm)
{

if (theForm.Correo_Electronico.value == "")
{
alert("Please enter a value for the \"Correo_Electronico\" field.");
theForm.Correo_Electronico.focus();
return (false);
}
return (true);
}
//--></script><!--webbot BOT="GeneratedScript" endspan --><form action="../Otro.php" method="POST" ENCTYPE="text/plain" onsubmit="return FrontPage_Form1_Validator(this)" language="JavaScript" name="FrontPage_Form1">

<center>

<p align="center" style="margin: 1"><font color="#00FFFF" face="Arial Black" size="4">
<span style="background-color: #000080">&nbsp;&nbsp;&nbsp; SOLICITUD &nbsp;&nbsp;&nbsp;
</span></font></p>

<p style="margin: 1"><font size="1">&nbsp;</font></p>
<table border="0" width="586" height="63" id="AutoNumber1" cellspacing="1" bordercolor="#C0C0C0" style="border-collapse: collapse">
<tr>
<td width="567" height="17" colspan="2" align="center" bgcolor="#C0C0C0">
DATOS DE CONTACTO</td>
</tr>

.....Resto de variables

</form>

</body>

</html>


y el php completo es ahora

Cita:
<?
require ('class.phpmailer.php');

echo nl2br(print_r ($_REQUEST, true));

$mail = new PHPMailer();
$mail->IsSMTP();
$mail->From = "[email protected]";;
$mail->FromName = "Nombre usuario prueba";
$mail->Host = 'mail.djhsoluciones.com';
$mail->SMTPAuth = true;
$mail->Username = '[email protected]';
$mail->Password = '333321';
$mail->AddAddress("[email protected]", "Su nombre");
$mail->Subject = "Asunto";
$mail->Body = $_REQUEST;
if($mail->Send())
{
echo "email enviado";
exit;
}
echo "Hubo un error enviando el mensaje";
?>
¿Que esta ocurriendo para que todos los superglobals lleguen vacios?

Gracias anticipadas.

NOTA: El hosting utiliza PHP 5.0
  #2 (permalink)  
Antiguo 19/11/2006, 20:04
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
No puedes hacer simplemente:
$mail->Body = $_REQUEST

Así es lógico que te diga "array" por qué eso es lo que es .. un array que contiene todas las variables que en tu formulario (por GET o POST e incluso COOKIES definieses) tengas.

Tienes várias opciones y consejos que seguir:

1) .. Si no te interesa dar formato a tu e-mail (lo cual deberías hacer!!!!!) y no usarlo como un simple "form2mail" de aquellos de hace una decada casi (en Perl/CGI) genéricos .. deberías hacer algo tipo.

Código PHP:
$body "Datos recibidos:<br>";
foreach (
$_POST as $variable=>$valor){
$body .= $variable." = ".$valor."<br>"
// no veo si envias el e-mail en HTML o en texto plano .. en cualquier caso será un tag html de salo de línea como el <br> o bien un código de control como el \n
}

$mail->Body $body;
// etc ... 
Si te fijas, con el bucle foreach() recorro el array POST (y no "REQUEST" .. sólo quiero lo que tu formulario me entrega .. no quiero lo que me mentan por GET ni sea COOKIE = cuanto más discrimines y mejor filtres mejor para tu seguridad .. ).

2) .. Quedaría mejor componer un e-mail (el cuerpo) concatenando tus variables del formulario con algún formato que le des más "legible" para la persona que lo reciba según el contexto de lo que signifiquen para quien lo tenga que procesar.

Código PHP:
$body "blabal ".$_POST['alguna_variable']." más blabla ".$_POST['otra_variale']. "etc ..."
Otros consejos:
No debes confiar sólo en las validaciones javascript .. debes validar también en código PHP (del lado del servidor) .. por qué te podrían inyectar datos directamente a tu script de proceso y pasar por alto tu validación Javascirpt.

NO uses $_REQUEST, usa el método que esperas ($_POST, $_GET . etc).

Ahora está de moda usar los formularios de contactos como el tuyo para hacer "spam" .. valida que no te ingresen ciertos datos que podrían ser tomados como "cabeceras" e inyectar código para hacer envios de e-mail a traves de tu formulario a otras direcciones.

Revisa este mensaje sobre el tema:
http://www.forosdelweb.com/f18/seguridad-anti-spam-357765/

No estaría de más por seguridad usar en tu formulario las técnicas de "Captcha" (tienes una FAQ que explica el método).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 20/11/2006, 02:09
 
Fecha de Ingreso: noviembre-2006
Mensajes: 4
Antigüedad: 17 años, 5 meses
Puntos: 0
Gracias CLUSTER. Voy a seguir tu consejo y blindare el tema de Spam, como me dices.

Se nota que estoy oxidado ¿No?.

Voy a ver como queda el tema con tus consejos.
  #4 (permalink)  
Antiguo 20/11/2006, 04:36
 
Fecha de Ingreso: noviembre-2006
Mensajes: 4
Antigüedad: 17 años, 5 meses
Puntos: 0
CLUSTER, antes de meterme a hacer filtros de seguridad, he implementado el codigo de prueba que aparece abajo.

He prescindido absolutamente de FP. He retirado hasta las extensiones en el servidor, por si estaba mareando a las superglobals, y ahora la declaracion del formulario es tan sencilla como esto

Cita:
<body>

<? require ('class.phpmailer.php'); # <--- Carga la biblioteca de phpmailer ?>


<form method="post" action="../Otro.php" ENCTYPE="text/plain">
Y el php (Otro.php) lo he puesto asi:

Cita:
<?
require ('class.phpmailer.php');

//---> Chequeo
$vacio = $post = array();
foreach ($_POST as $nombre_var => $valor_var) {
if (empty($valor_var)) {
$vacio[$nombre_var] = $valor_var;
} else {
$post[$nombre_var] = $valor_var;
}
}

if (empty($_POST)) { print "La variable POST esta vacia. \<br>";}

print "<pre>";
if (empty($vacio)) {
print "Ninguno de los valores POST est&aacute;n vac&iacute;os, se envi&oacute;:\n";
var_dump($post);
} else {
print "Tenemos " . count($vacio) . " valores vac&iacute;os\n";
print "Se envi&oacute;:\n"; var_dump($post);
print "Vac&iacute;os:\n"; var_dump($vacio);
exit;
}

//---> Fin de chequeo
El resultado ha sido
Cita:
La variable POST esta vacia. \

Ninguno de los valores POST están vacíos, se envió:
array(0)
y nada mas, asi que pienso que no esta pasando ninguna informacion desde el formulario mediante el superglobal $_POST.

¿Sabes a que puede deberse que $_POST siempre llegue vacio?

Gracias.

Última edición por ManoloJ; 20/11/2006 a las 07:49 Razón: Mas informacion
  #5 (permalink)  
Antiguo 20/11/2006, 09:34
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Indica el código completo de tu formulario HTML. Aunque lo natural sería usar y definir: ENCTYPE="text/plain" omitelo por el momento.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 20/11/2006, 11:12
 
Fecha de Ingreso: noviembre-2006
Mensajes: 4
Antigüedad: 17 años, 5 meses
Puntos: 0
Bien Cluster, hemos encontrado el problema.

Resulta que como bien has dicho en el mensaje anterior, yo utilizaba ENCTYPE=""text/plain", entonces me pasaba los parametros en una variable dentro de $GLOBALS llamada HTTP_RAW_POST_VARS (Sin formato, como tambien dijiste).

Simplemente he cambiado por ENCTYPE="HTM" y las variables del formulario estan ya disponibles directamente en $GLOBALS y en $_POST.

A partir de aqui, solo es configurar el formato y poner los filtros (Que he de leer con detenimiento el FAQ al respecto porque he visto que hay mucho por controlar).

Muchas gracias por tu atencion. Nos vemos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:06.