Foros del Web » Programando para Internet » PHP »

Protección de formulario contra inyección sql (ando perdido)

Estas en el tema de Protección de formulario contra inyección sql (ando perdido) en el foro de PHP en Foros del Web. Saludos y muy buenos días, les comento que tengo un problema con un sitio web que mi superior decidio que yo me hiciera cargo despues ...
  #1 (permalink)  
Antiguo 17/03/2016, 08:44
 
Fecha de Ingreso: junio-2007
Mensajes: 7
Antigüedad: 16 años, 10 meses
Puntos: 0
Protección de formulario contra inyección sql (ando perdido)

Saludos y muy buenos días, les comento que tengo un problema con un sitio web que mi superior decidio que yo me hiciera cargo despues de lo hackearan, realizandole un test de seguridad con acunetix (afortunadamente contamos con la licencia), me detecto un archivo .php vulnerable a todo y que hace una consulta a una base de datos de libros, para mostrar el resultado en una tabla y una pantalla con la ficha bibliografica del libro seleccionado.

Mi problema es que no tengo idea de programación, investigando un poco y leyendo me encuentro con que puedo ingresar la siguiente función al formulario:

function Security($_Cadena) {
$_Cadena = htmlspecialchars(trim(addslashes(stripslashes(stri p_tags($_Cadena)))));
$_Cadena = str_replace(chr(160),'',$_Cadena);
return mysql_real_escape_string($_Cadena);
}


Me dice que la puedo implementar con el siguiente codigo:

$ejemplo = trim(Security($_POST["ejemplo"]));

Aqui lo que pasa es que no tengo ni idea de que me habla, no se si tengo que hacer otra pagina php, o si se debe ingresar en el mismo formulacio.

Si alguien pudiera apoyarme, el sitio esta desarrollado en wordpress, la base de datos es mysql, y por cierto mi especialidad son los sistemas de información geograficos, e ahi el pequeño detalle.

Por cierto, como le hacen para ingresar en los post el codigo php o html dentro de un cuadro desplazable, les digo estoy totalmente perdido.

Gracias
  #2 (permalink)  
Antiguo 17/03/2016, 11:11
 
Fecha de Ingreso: junio-2007
Mensajes: 7
Antigüedad: 16 años, 10 meses
Puntos: 0
Respuesta: Protección de formulario contra inyección sql (ando perdido)

ACTUALIZANDO

Me encontre con esto mysql_real_escape_string que en teoria limpia la entrada de datos "raros", pero ahora resulta que cuando hago una consulta me indica que esta vacia.

$pSQL = mysql_real_escape_string($pSQL1);

Y todo por no querer contratar un programador.
  #3 (permalink)  
Antiguo 17/03/2016, 12:46
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Protección de formulario contra inyección sql (ando perdido)

Cita:
Iniciado por lnunez Ver Mensaje
ACTUALIZANDO

Me encontre con esto mysql_real_escape_string que en teoria limpia la entrada de datos "raros", pero ahora resulta que cuando hago una consulta me indica que esta vacia.

$pSQL = mysql_real_escape_string($pSQL1);

El asunto es que debes "escapar" dato por dato y no la consulta completa.

Sería interesante conocer el código que usas en lugar de intentar adivinarlo.

Cita:
Y todo por no querer contratar un programador.
Pues sí, no hay mejor que dejar que alguien profesional te ayude.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 17/03/2016, 14:18
 
Fecha de Ingreso: junio-2007
Mensajes: 7
Antigüedad: 16 años, 10 meses
Puntos: 0
Respuesta: Protección de formulario contra inyección sql (ando perdido)

Saludos pateketrueke, este es el codigo.


Código PHP:
Ver original
  1. <?
  2. //**Variables que proporcionan la capacidad de cambiar el
  3. //**motor de datos si se requiere.
  4. global $DATOS;
  5. $DATOS["motor"] = "clsMySQL()";
  6. //******************************************************
  7. //**Clase que proporciona el servicio de datos.
  8. class clsServicoDeDatos{
  9.     var $IDatos;
  10.     function ObtenerIDatos(){
  11.         global $DATOS;
  12.         $this->IDatos = new clsIDatos($DATOS["motor"]);
  13.         return $this->IDatos;
  14.     }
  15. }
  16. //*********************************************
  17. //**Clase que proporciona la interfaz con el motor de datos.
  18. class clsIDatos extends clsMySQL{
  19.     function clsIDatos($pMotor="clsMySQL()"){
  20.         //eval("\$this = new $pMotor;");
  21.     }
  22. }
  23. //**********************************************************
  24. class clsMySQL{
  25.     //Esta clase proporciona las instrucciones de manejos de datos para MySQL.
  26.     function _ObtenerParametro($pParam){
  27.     /*
  28.     Recibe una cadena con el parámetro a obtener, estos parámetros están almacenados en la tabla GENERAL
  29.     */
  30.         $R = 0;
  31.         switch ($pParam){
  32.             case "grupo":
  33.                 $R = 5;
  34.                 break;
  35.             case "modulo":
  36.                 $R = 1;
  37.                 break;
  38.             case "modulo de solicitudes":
  39.                 $R = 28;
  40.                 break;
  41.             case "modulo de revision de documentos":
  42.                 $R = 36;
  43.                 break;
  44.             case "estatus encuesta":
  45.                 $R = 13;
  46.                 break;
  47.             case "encuesta vigente":
  48.                 $R = 14;
  49.                 break;
  50.             case "encuesta no vigente":
  51.                 $R = 15;
  52.                 break;
  53.             case "tipos de documento":
  54.                 $R = 17;
  55.                 break;
  56.             case "tipos de hipervínculo":
  57.                 $R = 20;
  58.                 break;
  59.             case "solicitud pendiente":
  60.                 $R = 30;
  61.                 break;
  62.             case "solicitud terminada":
  63.                 $R = 31;
  64.                 break;
  65.             case "secciones publicas":
  66.                 $R = 18;
  67.                 break;
  68.             case "secciones privadas":
  69.                 $R = 19;
  70.                 break;
  71.             case "ámbito de documento":
  72.                 $R = 43;
  73.                 break;
  74.             case "estatus de documento":
  75.                 $R = 47;
  76.                 break;
  77.             case "documento en aprobación":
  78.                 $R = 48;
  79.                 break;
  80.             case "documento aprobado":
  81.                 $R = 49;
  82.                 break;
  83.         }
  84.         return $R;
  85.     }
  86.  
  87.     function ObtenerFicha($pNF){
  88.         /*
  89.         Obtiene los campos necesarios para la creación de la clase clsFicha.
  90.         Recibe como parámetro el número de la ficha a mostrar.
  91.         */
  92.         $SQL = "SELECT  FIC_ID,
  93.                         FIC_CLADEWEY,
  94.                         FIC_CLALOCAL,
  95.                         FIC_AUTPERSONAL,
  96.                         FIC_TITULO,
  97.                         FIC_ISBN,
  98.                         FIC_EDICION,
  99.                         FIC_LUGAR,
  100.                         FIC_PAGINAS,
  101.                         FIC_SERIE,
  102.                         FIC_NOTGENERALES,
  103.                         FIC_NOTBIBLIOGRAFIA,
  104.                         FIC_NOTCONTENIDO,
  105.                         FIC_ENCAUTOR,
  106.                         FIC_ENCAUCORPORATIVO,
  107.                         FIC_ENCNOMGRAFICOS,
  108.                         FIC_ENCTEMA,
  109.                         FIC_AUTCORPORATIVO,
  110.                         FIC_TITULOALT,
  111.                         FIC_RESUMEN
  112.                 FROM ficha             
  113.                 WHERE FIC_ID = $pNF";
  114.                
  115. //              $SQL = "SELECT * FROM ficha WHERE FIC_ID = $pNF";
  116.                
  117.         return $this->_Ejecutar($pSQL1);
  118.     }
  119.    
  120.     function BuscarFichas($T, $V){     
  121.         /*
  122.         Busca las fichas que concuerden con el criterio de búsqueda.
  123.         Recibe como parámetro el tipo de búsqueda y el valor a buscar.     
  124.         */
  125.         $Con = '1';
  126.        
  127.         switch($T){
  128.        
  129.             case "BBuscar":
  130.                 $Con = "FIC_CLADEWEY LIKE '%$V%' OR
  131.                         FIC_CLALOCAL LIKE '%$V%' OR
  132.                         FIC_AUTPERSONAL LIKE '%$V%' OR
  133.                         FIC_AUTCORPORATIVO LIKE '%$V%' OR
  134.                         FIC_AUTASAMBLEA LIKE '%$V%' OR
  135.                         FIC_ASITITULO LIKE '%$V%' OR
  136.                         FIC_TITUNIFORME LIKE '%$V%' OR
  137.                         FIC_TITULO LIKE '%$V%' OR
  138.                         FIC_EDICION LIKE '%$V%' OR
  139.                         FIC_LUGAR LIKE '%$V%' OR
  140.                         FIC_PAGINAS LIKE '%$V%' OR
  141.                         FIC_SERIE LIKE '%$V%' OR
  142.                         FIC_NOTGENERALES LIKE '%$V%' OR
  143.                         FIC_NOTBIBLIOGRAFIA LIKE '%$V%' OR
  144.                         FIC_NOTCONTENIDO LIKE '%$V%' OR
  145.                         FIC_NOTIDIOMA LIKE '%$V%' OR
  146.                         FIC_ENCAUTOR LIKE '%$V%' OR
  147.                         FIC_ENCAUCORPORATIVO LIKE '%$V%' OR
  148.                         FIC_ENCTEMA LIKE '%$V%' OR
  149.                         FIC_ENCNOMGRAFICOS LIKE '%$V%'";
  150.             /*case "Buscar":
  151.                 $Con = "MATCH(FIC_ISBN, FIC_CLADEWEY, FIC_CLALOCAL, FIC_AUTPERSONAL, FIC_AUTCORPORATIVO, FIC_AUTASAMBLEA, FIC_ASITITULO, FIC_TITUNIFORME,   FIC_TITULO, FIC_EDICION, FIC_LUGAR, FIC_PAGINAS, FIC_SERIE, FIC_NOTGENERALES, FIC_NOTBIBLIOGRAFIA, FIC_NOTCONTENIDO, FIC_NOTIDIOMA, FIC_ENCAUTOR,FIC_ENCAUCORPORATIVO,FIC_ENCTEMA,FIC_ENCNOMGRAFICOS ) AGAINST ('%$V%')";
  152.                 break;  */
  153.                
  154.             case "Buscar":
  155.                 $Con = "MATCH( FIC_TITULO, FIC_TITULOALT,FIC_AUTPERSONAL,FIC_NOTCONTENIDO, FIC_RESUMEN, FIC_CLADEWEY, FIC_ISBN ) AGAINST ('%$V%')";
  156.                 break;     
  157.             }
  158.         $SQL = "SELECT FIC_ID FROM ficha WHERE $Con";
  159.         return $this->_Ejecutar($pSQL1);
  160.     }
  161.  
  162. function _Ejecutar($pSQL1){
  163.         /*
  164.         Ejecuta las instrucciones en MySQL.
  165.         Recibe como parámetro la instrucción SQL, si es una consulta (SELECT), regresa un arreglo bidimensional, de lo contrario, un valor bolean igual a verdadero. Si falla la conexión al servidor MySQL o no se ejecuta con éxito la consulta, termina la ejecución del script.
  166.         */
  167.         set_time_limit(180);
  168.         /*
  169.         Conexion al server de MySQL
  170.   */
  171.    
  172.         $hostname = "*****";
  173.         $port = "*****";
  174.         $username = "*****";
  175.         $password = "*****";
  176.         $database = "*****";
  177.         $pSQL = mysql_real_escape_string($pSQL1);
  178.        
  179.         $C = mysql_connect("$hostname","$username","$password");
  180.         //$C = @mysql_connect("localhost", "*****", "*****");
  181.         //$C = @mysql_connect("localhost", "*****",""); // ************
  182.                        
  183.         if($C!=false){         
  184.             //mysql_db_query("*****", "SET NAMES 'utf8'", $C);
  185.             //$Res = @mysql_db_query("*****", utf8_encode($pSQL), $C);
  186.             $Res = @mysql_db_query("$database", $pSQL, $C);
  187.             if($Res!=false){
  188.                 if(substr($pSQL, 0, 6)=="SELECT"){
  189.                     $Return = array();
  190.                     $r=-1;
  191.                     while($Fila = mysql_fetch_row($Res)) {
  192.                         $r++;
  193.                         for($i=0; $i<count($Fila); $i++){
  194.                             $Return[$r][$i] = $Fila[$i];
  195.                         }
  196.                     }
  197.                     mysql_free_result($Res);
  198.                     mysql_close($C);
  199.                     return $Return;
  200.                 }else{
  201.                     mysql_close($C);
  202.                     return true;
  203.                 }              
  204.             }else{
  205.                 die (mysql_errno($C) . ": " . mysql_error($C) ) ;
  206.                 echo "<br />";
  207.                 /*die ( "No fue posible ejecutar la siguiente instrucción \"$pSQL\".");*/
  208.             }
  209.         }else{
  210.             die ("No se ha podido establecer la conexión con el servidor de datos.");
  211.         }
  212.     }
  213. }
  214. ?>
  #5 (permalink)  
Antiguo 17/03/2016, 15:07
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Protección de formulario contra inyección sql (ando perdido)

Para que te des una idea del problema:
Código PHP:
Ver original
  1. $foo = 'bar';
  2.  
  3. // MAL
  4. $sql = mysql_real_escape_string("SELECT * FROM tabla WHERE columna = '$foo'");
  5.  
  6. // BIEN
  7. $sql = "SELECT * FROM tabla WHERE columna = '$foo'";

¿Se entiende?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 17/03/2016, 15:18
 
Fecha de Ingreso: junio-2007
Mensajes: 7
Antigüedad: 16 años, 10 meses
Puntos: 0
Respuesta: Protección de formulario contra inyección sql (ando perdido)

Siendote honesto, no entiendo, como dije no soy programador, tengo la facilidad de poder aprender a manejar software como autocad, arcgis, map info, quantum gis, arcview, er mapper, global mapper, surfer etc. capacito a personal en dichos software, pero la programación nomas no se me da.

Te agradezco tu apoyo y saludos desde Guanajuato.
  #7 (permalink)  
Antiguo 17/03/2016, 19:10
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 2 meses
Puntos: 288
Respuesta: Protección de formulario contra inyección sql (ando perdido)

bueno haga un curso, hay miles en youtuve
  #8 (permalink)  
Antiguo 18/03/2016, 03:15
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Protección de formulario contra inyección sql (ando perdido)

Hola lnunez,

Lo que te intenta decir pateketrueke, además de una forma muy explícita y clara, es que la función se la debes pasar a cada variable que recibas antes de enviarlas a los métodos que usan tus clases del código que has pasado.

Por ejemplo:

Código PHP:
Ver original
  1. //RRecibes una variable por $_POST
  2. $variable = Security($_POST['variable']); //Le pasas la función "Security"
  3.  
  4. //Ahora es cuando le pasarías la variable "limpia" al método que vayas a utiizar

Espero que te aclare algo más.
  #9 (permalink)  
Antiguo 18/03/2016, 06:48
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: Protección de formulario contra inyección sql (ando perdido)

podrías utilizar cualquier de estas funciones a ver:

Código PHP:
Ver original
  1. //Limpia la variable de caracteres no permitidos
  2. //ESTA NO RECUERDO DONDE LA VI PARA PODER DARLE CRÉDITO AL AUTOR
  3. function limpiaVar($X){
  4.  
  5.     $NP = array("'",'\\','<','>',"\"",";","&","%","#");
  6.     $X = str_replace($NP, "", $X);
  7.    
  8. return $X;
  9. }
  10.  
  11. //escapa caracteres no válidos Ej entra D'jango y sale D\'jango. $X es la conexion a bd ej. $db
  12. //ESA SE ENCUENTRA AQUI EN FOROS DEL WEB
  13. function MyScape($X, $cadena) {
  14.     if(get_magic_quotes_gpc() != 0) {
  15.         $cadena = stripslashes($cadena);
  16.         return $cadena;
  17.     }else{
  18.     return mysqli_real_escape_string($db, $cadena);
  19.     }
  20. }
__________________
[email protected]
HITCEL
  #10 (permalink)  
Antiguo 18/03/2016, 18:43
 
Fecha de Ingreso: mayo-2013
Mensajes: 169
Antigüedad: 10 años, 10 meses
Puntos: 25
Respuesta: Protección de formulario contra inyección sql (ando perdido)

Cita:
Iniciado por lnunez Ver Mensaje
ACTUALIZANDO
Y todo por no querer contratar un programador.
YO que tu contrataria un profesional, ya que si tienes poca idea la puedes liar con la seguridad.

Y si quieres aprender contrata un profesor o haz un curso para que te enseñe (pero necesitas tiempo y dedicación). Pero vamos, si tienes un sitio web con base de datos y toda la historia estás arriesgando mucho si haces cosas sin saber por mucho que te guiemos. Es mi más humilde consejo.

Es como querer construir un edificio sin contratar un arquitecto, o sin aprender arquitectura.
  #11 (permalink)  
Antiguo 18/03/2016, 19:24
 
Fecha de Ingreso: junio-2007
Mensajes: 7
Antigüedad: 16 años, 10 meses
Puntos: 0
Respuesta: Protección de formulario contra inyección sql (ando perdido)

Saludos a todos, precisamente ahi esta el problema, este tema no era mio, pero al renunciar quien lo llevaba se le hizo facil al jefe decir "ahora lo haces tú", ya saben los directores de las dependencias de gobierno, son sabios en sus desiciones, lo que hare es un informe tomando sus recomendaciones, las cuales les agradezco y mucho, pero la verdad me declaro incompetente en el tema y como no tengo tiempo realmente para tomar un curso, prefiero seguir en lo si soy especialista que andar construyendo castillos en el aire.

Nuevamente les agradezco y si alguien necesita apoyo en los sorfwares antes mencionados o algo relacionado con gps, imagenes de satelite, ortofotos y lo que se relaciona con el temas gis, me pongo a sus ordenes.
  #12 (permalink)  
Antiguo 19/03/2016, 03:08
Avatar de vb2005  
Fecha de Ingreso: noviembre-2005
Ubicación: Paderborn - Alemania
Mensajes: 566
Antigüedad: 18 años, 5 meses
Puntos: 24
Respuesta: Protección de formulario contra inyección sql (ando perdido)

Yo de todas formas te recomendaría que te aprendas algun PDO o mejor algún ORM que venga como alguna librería para poder olvidarte de todos estos detalles.

Lo mejor sería que adpotes algún framework.
__________________
www.marcher.com.uy - Web personal
Nerd's Corner - Desarrollo de software a medida

Etiquetas: contra, formulario, html, inyección, mysql, sql, tabla
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 03:47.