AYUDA, VALIDAR DATOS Y EVITAR INYECCION EN FORMULARIO A BASE DE DATOS

Iniciado por antonioska, 22 Marzo 2013, 14:18 PM

0 Miembros y 2 Visitantes están viendo este tema.

antonioska

Primero que nada muchas gracias por tomarse el tiempo de leer mi publicación y ayudarme.
Les comento soy nuevo en esto, tal vez para ustedes sea muy fácil por eso les estoy solicitando su ayuda.
Hice un formulario el cual envía todo lo capturado a mi base de datos, funciona perfectamente, envía los datos, los almacena y me envía copia a mi email, pero el problema es que no tiene la seguridad suficiente para ya poder montarlo, lo que busco es validar los datos de mi formulario y evitar que se introduzca  código php y html en los campos para evitar una inyección a mi base de datos.
Les dejo mis códigos para ver si me pueden ayudar.


Formulario (enviar.php)
Citar<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Documento sin título</title>
<link href="style.css" rel="stylesheet" type="text/css" />
<style type="text/css">
body {
   background-image: url(imagenes/fondo.gif);
}
</style>
<HEAD>

<SCRIPT LANGUAGE="javascript">
<!-- Begin
function popUp(URL) {
day = new Date();
id = day.getTime();
eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=435,height=300');");
}
// End -->
</script>
</head>

<body>
<table width="701" border="0" align="center">
 <tr>
   <td height="856"><table width="701" border="0" cellpadding="0" cellspacing="0">
     <tr>
       <td colspan="3"><img src="imagenes/header.jpg" width="700" height="104" /></td>
       </tr>
     <tr>
       <td width="12" height="678" class="tablaizquierda">...</td>
       <td width="677" align="center" valign="top" class="fondonegro"><table width="674" border="1">
         <tr>
           <td>Registra tu Banda o tu pgrupo es muy sencillo, lo haces en tan solo 1 minuto, y lo mejor de todo es completamente gratuito, Llega a mas gente con la tecnologia de mundobajo.net</td>
         </tr>
       </table>          <table width="674" border="1">
         <tr>
           <td height="605"><form id="form1" name="form1" method="post" action="envia.php">
             <table width="662" border="1">
               <tr>
                 <td>&nbsp;</td>
               </tr>
             </table>
             <table width="662" border="1">
               <tr>
                 <td width="138" height="26" align="left" valign="middle" class="txtgenero"><strong><span class="asteriscorojo">*</span></strong> Nombre del Grupo:</td>
                 <td width="235"><label for="grupo"></label>
                   <input name="grupo" type="text" id="grupo" size="38" /></td>
                 <td width="119" align="left" valign="middle" class="txtgenero"><strong><span class="asteriscorojo">* </span></strong>Genero Musical:</td>
                 <td width="142"><label for="genero"></label>
                   <select name="genero" id="genero">
                     <option value="2 Tone">2 Tone</option>
                     <option value="Anarko Punk">Anarko Punk</option>
                     <option value="Calipso">Calipso</option>
                     <option value="Dancehall">Dancehall</option>
                     <option value="Dub">Dud</option>
                     <option value="Early Reggae">Early Reggae</option>
                     <option value="Hip Hop">Hip Hop</option>
                     <option value="Mento">Mento</option>
                     <option value="Mex Ska">Mex Ska</option>
                     <option value="Oi">Oi</option>
                     <option value="Punk">Punk</option>
                     <option value="Ragga">Ragga</option>
                     <option value="Rap">Rap</option>
                     <option value="Rap Chicano">Rap Chicano</option>
                     <option value="Rap Gangsta">Rap Gangsta</option>
                     <option value="Rap Subterraneo">Rap Subterraneo</option>
                     <option value="Rap Underground">Rap Underground</option>
                     <option value="Reggae ">Reggae</option>
                     <option value="Reggae Roots">Reggae Roots</option>
                     <option value="Rhythm And Blues">Rhythm And Blues</option>
                     <option value="Rock And Roll">Rock And Roll</option>
                     <option value="Rock Mod">Rock Mod</option>
                     <option value="Rocksteady">Rocksteady</option>
                     <option value="Ska Californiano">Ska Californiano</option>
                     <option value="Ska Core">Ska Core</option>
                     <option value="Ska Fusion">Ska Fusion</option>
                     <option value="Ska Hispano">Ska Hispano</option>
                     <option value="Ska Jazz">Ska Jazz</option>
                     <option value="Ska Reggae">Ska Reggae</option>
                     <option value="Ska Tradicional">Ska Tradicional</option>
                     <option value="Ska Yeye">Ska Yeye</option>
                     <option value="Skinhead Reggae">Skinhead Reggae</option>
                     <option value="Soul">Soul</option>
                     <option value="Street Punk">Street Punk</option>
                     <option value="Third Wave">Third Wave</option>
                     <option value="Jazz">Jazz</option>
                   </select></td>
               </tr>
           </table>
             <table width="662" border="1">
               <tr>
                 <td width="311" height="29" align="left" valign="middle"><span class="txtgenero">* Urrl del Logo o foto del grupo:</span><br />
                   <span class="txtblancomini"><A HREF="javascript:popUp('http://mundobajo.net/bandas/imagenes/form.html')" class="txtblancomini">- Da click aqui </A><a href="javascript:popUp('http://mundobajo.net/bandas/imagenes/form.html')" class="txtblancomini">para subir la imagen</a></span></td>
                 <td width="335"><label for="soundcloud2"></label>
                   <input name="soundcloud2" type="text" id="soundcloud2" size="56" /></td>
                 </tr>
             </table>
             <table width="662" border="1">
               <tr>
                 <td width="359" height="55" align="left" valign="middle"><strong><span class="asteriscorojo">*</span></strong><span class="txtgenero">Integrantes del grupo:</span><br />
                   <span class="txtblancomini">1por linea, ejemplo:<br />
                   Juan perez (Bateria)<br />
                   Rodrigo (Trompeta)</span></td>
                 <td width="287"><label for="integrantes"></label>
                   <textarea name="integrantes" id="integrantes" cols="45" rows="5"></textarea></td>
               </tr>
             </table>
             <table width="662" border="1">
               <tr>
                 <td width="359" align="left" valign="middle"><strong><span class="asteriscorojo">* </span></strong><span class="txtgenero">Principales influencias del grupo: </span></td>
                 <td width="287"><label for="influencia"></label>
                   <textarea name="influencia" id="influencia" cols="45" rows="5"></textarea></td>
               </tr>
             </table>
             <table width="662" border="1">
               <tr>
                 <td width="359" align="left" valign="middle"><strong><span class="asteriscorojo">* </span></strong><span class="txtgenero">Historia y trascendencia:</span></td>
                 <td width="287"><label for="historia"></label>
                   <textarea name="historia" id="historia" cols="45" rows="5"></textarea></td>
               </tr>
             </table>
             <table width="662" border="1">
               <tr>
                 <td align="left" valign="middle" class="txtfoter"><strong>Para registrar un video de youtube has lo siguiente, abre tu video, una vez abierto dirigete a la barra de direcciones <img src="imagenes/youtube.jpg" width="234" height="16" /> y copia el codigo que se muestra despues de<span class="asteriscorojo"> = </span>por ejemplo: mi video es http://www.youtube.com/watch?v=<span class="txtgenero">sebwdVmGWjc</span> Ó http://youtu.be/<span class="txtgenero">sebwdVmGWjc </span>, unicamente colocare lo marcado en blanco<br />
                 </strong></td>
               </tr>
             </table>
             <table width="662" border="1">
               <tr>
                 <td width="65" height="26" align="left" valign="middle" class="txtgenero"><strong><span class="asteriscorojo">* </span></strong>Video Youtube 1:</td>
                 <td width="138"><label for="video1"></label>
                   <input name="video1" type="text" id="video1" size="22" /></td>
                 <td width="68" align="left" valign="middle" class="txtgenero"><strong><span class="asteriscorojo">* </span></strong>Video Youtube 2:</td>
                 <td width="139"><label for="video2"></label>
                   <input name="video2" type="text" id="video2" size="22" /></td>
                 <td width="80" align="left" valign="middle" class="txtgenero"><strong><span class="asteriscorojo">* </span></strong>Video youtube3:</td>
                 <td width="132"><label for="soundcloud1"></label>
                   <input name="soundcloud1" type="text" id="soundcloud1" size="22" /></td>
                 </tr>
             </table>
             <table width="662" border="1">
               <tr>
                 <td>&nbsp;</td>
               </tr>
             </table>
             <table width="662" border="0">
               <tr>
                 <td width="163" class="txtgenero"><strong class="asteriscorojo">*</strong> Nombre del representante:</td>
                 <td width="215"><label for="representante"></label>
                   <input name="representante" type="text" id="representante" size="34" /></td>
                 <td width="56" class="txtgenero"><strong class="asteriscorojo">*</strong> Correo:</td>
                 <td width="210"><label for="email"></label>
                   <input name="email" type="text" id="email" size="33" /></td>
               </tr>
             </table>
             <table width="662" border="1">
               <tr>
                 <td width="62" align="left" valign="middle" class="txtgenero">Facebook:</td>
                 <td width="256"><label for="facebook"></label>
                   <input name="facebook" type="text" id="facebook" size="42" /></td>
                 <td width="48" align="left" valign="middle" class="txtgenero">Twitter:</td>
                 <td width="268"><label for="twitter"></label>
                   <input name="twitter" type="text" id="twitter" size="38" /></td>
                 </tr>
             </table>
             <table width="662" border="1">
               <tr>
                 <td width="72" align="left" valign="middle" class="txtgenero">Pagina web:</td>
                 <td width="180"><label for="url"></label>
                   <input name="url" type="text" id="url" size="30" /></td>
                 <td width="196" align="left" valign="middle" class="txtgenero">Url Para descargar disco o demo:</td>
                 <td width="186"><label for="descarga"></label>
                   <input name="descarga" type="text" id="descarga" size="31" /></td>
               </tr>
             </table>
             <table width="662" border="1">
               <tr>
                 <td height="18" align="center" valign="middle" class="txtblancomini"><a href="http://mundobajo.net/tyc.php" target="_blank" class="txtblancomini">Terminos y condiciones de Mundobajo.net<br />
                   Al precionar el boton de registrar banda estas aceptando nuestros terminos y condiciones.</a><a href="http://mundobajo.net/tyc.php" target="_blank" class="txtgenero"><br />
                 </a></td>
               </tr>
           </table>
             <table width="300" border="1" align="center">
               <tr>
                 <td align="center" valign="middle"><input type="submit" name="button" id="button" value="Registrar banda" /></td>
                 </tr>
             </table>
           </form></td>
           </tr>
       </table>
       <p><br />
       </p></td>
       <td width="12" class="tabladerecha">...</td>
     </tr>
     <tr>
       <td height="90" colspan="3" align="center" valign="top" class="fondofoter"><table width="700" border="0" align="center">
         <tr>
             <td width="87"><img src="imagenes/mbn.png" width="86" height="35" /></td>
           </tr>
       </table></td>
       </tr>
   </table></td>
 </tr>
</table>
</body>
</html>

envia.php
Citar<?php
$grupo = $_REQUEST['grupo'] ;
$genero = $_REQUEST['genero'] ;
$representante = $_REQUEST['representante'] ;
$email = $_REQUEST['email'] ;
$url = $_REQUEST['url'] ;
$facebook = $_REQUEST['facebook'] ;
$twitter = $_REQUEST['twitter'] ;
$incluencia = $_REQUEST['influencia'] ;
$historia = $_REQUEST['historia'] ;
$integrantes = $_REQUEST['integrantes'] ;
$video1 = $_REQUEST['video1'] ;
$video2 = $_REQUEST['video2'] ;
$soundcloud1 = $_REQUEST['soundcloud1'] ;
$soundcloud2 = $_REQUEST['soundcloud2'] ;

$confirmacion = "Estos son los datos que has introducido. Muchas gracias por tu participación:<br /><br />Nombre: $grupo <br />Genero: $genero";
mysql_connect ('localhost', 'root', 'pass') or die ('Error: ' . mysql_error());
mysql_select_db ('grupos');
$query="INSERT INTO grupos (grupo, genero, representante, email, url, facebook, twitter, influencia, historia, integrantes, video1, video2, soundcloud1, soundcloud2) VALUES ('$grupo', '$genero', '$representante', '$email', '$url', '$facebook', '$twitter', '$influencias', '$historia', '$integrantes', '$video1', '$video2', '$soundcloud1', '$soundcloud2')";
mysql_query($query) or die ('Error en la carga de datos');
mail($email, "Asunto del mensaje", $confirmacion, "From: mimail@pagina.net");
header("location:http://mundobajo.net/enviado.php")
?>


Espero me puedan ayudar, Gracias ;D

kalvinman

La forma mas simple de evitar problemas de inyeccion de codigo y de SQL es usando la funcion sprintf() de PHP
http://php.net/manual/en/function.sprintf.php

dank_

Primero que nada te recomiendo usar las funciones de mysqli en lugar de las de mysql, estás últimas están desaconsejadas por la propia documentación de PHP.


Y bueno la manera ideal de meter datos de forma segura es usando los bind params, ya que los bind params son una forma nativa de los propios lengaues SQL para meter insertar datos sin tener que preocuparte por caracteres especiales.

La otra manera es usar la función mysqli_real_escape_string para escapar las comillas de los usuarios. Para eso harías algo así con todas tus variables.
$grupo = mysqli_real_escape_string($_REQUEST['grupo']);

Ahora aparte de la inyección de SQL también te pueden hacer una inyección de cabeceras al mandar el email (Y con ello usar tu servidor para hacer SPAM)  :silbar:. Esto puede ser un poquito mas complejo ya que PHP no tiene una función nativa para limpiar este tipo de datos, así que te recomiendo mirarte este artículo.

antonioska

Cita de: dank_ en 23 Marzo 2013, 21:19 PM
Primero que nada te recomiendo usar las funciones de mysqli en lugar de las de mysql, estás últimas están desaconsejadas por la propia documentación de PHP.


Y bueno la manera ideal de meter datos de forma segura es usando los bind params, ya que los bind params son una forma nativa de los propios lengaues SQL para meter insertar datos sin tener que preocuparte por caracteres especiales.

La otra manera es usar la función mysqli_real_escape_string para escapar las comillas de los usuarios. Para eso harías algo así con todas tus variables.
$grupo = mysqli_real_escape_string($_REQUEST['grupo']);

Ahora aparte de la inyección de SQL también te pueden hacer una inyección de cabeceras al mandar el email (Y con ello usar tu servidor para hacer SPAM)  :silbar:. Esto puede ser un poquito mas complejo ya que PHP no tiene una función nativa para limpiar este tipo de datos, así que te recomiendo mirarte este artículo.

muchas gracias por contestar y por tu ayuda :D

antonioska

Cita de: kalvinman en 23 Marzo 2013, 00:04 AM
La forma mas simple de evitar problemas de inyeccion de codigo y de SQL es usando la funcion sprintf() de PHP
http://php.net/manual/en/function.sprintf.php

muchas gracias  ;-)