Foros del Web » Programando para Internet » PHP »

funcion para evitar xss sql injection

Estas en el tema de funcion para evitar xss sql injection en el foro de PHP en Foros del Web. Hola Mi pregunta es en relación al aporte que nos dejo GatorV en http://www.forosdelweb.com/f18/funci...5/#post3497564 Entiendo que sirve para xss pero si los campos del formulario ...
  #1 (permalink)  
Antiguo 18/11/2011, 00:55
 
Fecha de Ingreso: septiembre-2011
Mensajes: 73
Antigüedad: 12 años, 7 meses
Puntos: 0
Pregunta funcion para evitar xss sql injection

Hola
Mi pregunta es en relación al aporte que nos dejo GatorV en

http://www.forosdelweb.com/f18/funci...5/#post3497564

Entiendo que sirve para xss pero si los campos del formulario finalmente van a entrar en la base de datos mi pregunta es si primero el dato recibido por $_POST debe pasar el filtro de la función xss y luego hacerse un mysql_real_escape_string.

Si es así y si es preferible reforzar mysql_real_escape_string con otras funciones agradecería aportes.

saludos
  #2 (permalink)  
Antiguo 18/11/2011, 12:03
 
Fecha de Ingreso: septiembre-2011
Mensajes: 73
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: funcion para evitar xss sql injection

¿alguien puede aclararme?.....gracias
  #3 (permalink)  
Antiguo 18/11/2011, 12:17
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: funcion para evitar xss sql injection

yo le pondria striplashes o addslashes antes

addlashes($_POST['ejemplo']) para escapar los datos y luego el mysql_real_scape_string

mas funciones que puedes combinar

addlashes = añade barras invertidas escapa datos mysql
striplashes =kita barras invertidas escapa datos mysql

para retirar php y hmtl del string usa strip_tags()
para convertir html del string usa htmlentities() o htmlspecialchars()
strtolower todo a minusculas strtolower()
trim() kitaespacios

Última edición por webankenovi; 18/11/2011 a las 13:14
  #4 (permalink)  
Antiguo 19/11/2011, 02:32
 
Fecha de Ingreso: septiembre-2011
Mensajes: 73
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: funcion para evitar xss sql injection

Ok ..luego entre las funciones de php (strip_tags, stripslahes,...) y la del aporte de GatorV entiendo que esta segunda debe ser mas segura para xss pero no se si debe cargar mucho al interprete php en caso de tener muchos campos en un formulario

como lo ves?
gracias
  #5 (permalink)  
Antiguo 20/11/2011, 12:18
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: funcion para evitar xss sql injection

si el aporte de gatorv te funciona puedes combinar ambos y ampliar tu seguridad , lo de gatorv es para evitar xss en todos los campos que el usuario use para introducir cualquier texto y evitar que añadan codigo malicioso , pero para base de datos php en su manual dice que hay que hacer un addslashes , stripslashes y mysql_real_scape_string , puedes combinar lo de gatorv y las funcones de php y luego un mysql_real_scape_string . y lo de los formularios no se si cargara mucho yo lo que recomiendo es usar solo las funciones que necesites es decir para un campo de solo numeros hago un int() y si no kiero que añadan nada de codigo html o php le añado tambien struip_tags y si solo lo kiero en minusculas añado strtolower y si kiero retirar espacios añado trim() , segun el campo hago unas cosas u otras y si ademas ese campo va guardado en bd le ago un stripslashes y luego un mysql_real_scape_string mas o menos eso es lo que yo hago , si tienes mas dudas aki estoy
  #6 (permalink)  
Antiguo 20/11/2011, 23:19
 
Fecha de Ingreso: septiembre-2011
Mensajes: 73
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: funcion para evitar xss sql injection

Aclarado gracias voy a implementarlo si tengo nuevas dudas vuelvo a postear.
saludos
  #7 (permalink)  
Antiguo 21/11/2011, 08:22
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: funcion para evitar xss sql injection

Yo a esa función/método le añadí esta otra función/método para evitar que insertaran html
Código PHP:
Ver original
  1. <?php
  2. class Filter_Xss
  3. {
  4.     /**
  5.      * Remove XSS attacks that came in the input
  6.      *
  7.      * Function taken from:
  8.      * http://quickwired.com/smallprojects/php_xss_filter_function.php
  9.      * and alter to use in application
  10.      *
  11.      * @param string $value The value to filter
  12.      * @return string
  13.      */
  14.     public function filterXss($params, $returnStr = false)
  15.     {
  16.         $params = is_array($params) ? $params : array($params);
  17.  
  18.         foreach($params as $key => $val){
  19.             if(!is_array($val)){
  20.                 /**
  21.                  * remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed
  22.                  * this prevents some character re-spacing such as <java\0script>
  23.                  * note that you have to handle splits with \n, \r, and \t later since
  24.                  * they *are* allowed in some inputs
  25.                  */
  26.                 $val = preg_replace('/([\x00-\x08][\x0b-\x0c][\x0e-\x20])/', '', $val);
  27.  
  28.                 /**
  29.                  * straight replacements, the user should never need these since they're normal characters
  30.                  * this prevents like
  31.                  * <IMG SRC=&#X40&#X61&#X76&#X61&#X73&#X63&#X72&#X69&#X70&#X74&#X3A&#X61&#X6C&#X65&#X72&#X74&#X28&#X27&#X58&#X53&#X53&#X27&#X29>
  32.                  */
  33.                 $search = 'abcdefghijklmnopqrstuvwxyz';
  34.                 $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  35.                 $search .= '1234567890!@#$%^&*()';
  36.                 $search .= '~`";:?+/={}[]-_|\'\\';
  37.                 for($i = 0; $i < strlen($search); $i++){
  38.                     /**
  39.                      * ;? matches the ;, which is optional
  40.                      * 0{0,7} matches any padded zeros, which are optional and go up to 8 chars
  41.                      */
  42.  
  43.                     /**
  44.                      * &#x0040 @ search for the hex values
  45.                      */
  46.                     $val = preg_replace('/(&#[x|X]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // with a ;
  47.                     /**
  48.                      * &#00064 @ 0{0,7} matches '0' zero to seven times
  49.                      */
  50.                     $val = preg_replace('/(&#0{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ;
  51.                 }
  52.  
  53.                 /**
  54.                  * now the only remaining whitespace attacks are \t, \n, and \r
  55.                  */
  56.                 $ra1 = array(
  57.                     'javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link',
  58.                     'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer',
  59.                     'layer', 'bgsound', 'title', 'base'
  60.                 );
  61.                 $ra2 = array(
  62.                     'onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate',
  63.                     'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste',
  64.                     'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange',
  65.                     'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut',
  66.                     'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate',
  67.                     'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop',
  68.                     'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout',
  69.                     'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture',
  70.                     'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover',
  71.                     'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange',
  72.                     'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter',
  73.                     'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange',
  74.                     'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload'
  75.                 );
  76.                 $ra = array_merge($ra1, $ra2);
  77.  
  78.                 $found = true; // keep replacing as long as the previous round replaced something
  79.                 while($found){
  80.                     $val_before = $val;
  81.                     for($i = 0; $i < sizeof($ra); $i++){
  82.                         $pattern = '/';
  83.                         for($j = 0; $j < strlen($ra[$i]); $j++){
  84.                             if($j > 0){
  85.                                 $pattern .= '(';
  86.                                 $pattern .= '(&#[x|X]0{0,8}([9][a][b]);?)?';
  87.                                 $pattern .= '|(&#0{0,8}([9][10][13]);?)?';
  88.                                 $pattern .= ')?';
  89.                             }
  90.                             $pattern .= $ra[$i][$j];
  91.                         }
  92.                         $pattern .= '/i';
  93.                         $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2); // add in <> to nerf the tag
  94.                         $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags
  95.                         if($val_before == $val){
  96.                             /**
  97.                              * no replacements were made, so exit the loop
  98.                              */
  99.                             $found = false;
  100.                         }
  101.                     }
  102.                 }
  103.             }
  104.             $params[$key] = is_array($val) ? $this->filterXss($val) : $val;
  105.         }
  106.  
  107.         return $returnStr ? $params[0] : $params;
  108.     }
  109.  
  110.     /**
  111.      * Remove XSS attacks and remove tags and extra white spaces
  112.      * that came in the input before and after
  113.      *
  114.      * @param string|array $params The value to filter
  115.      * @param bool Set this if you want to return string value
  116.      * @return string|array
  117.      */
  118.     public function realEscapeString($params, $returnStr = false)
  119.     {
  120.         /**
  121.          * Check for XSS atacks
  122.          */
  123.         $params = $this->filterXss($params, $returnStr);
  124.  
  125.         $params = is_array($params) ? $params : array($params);
  126.  
  127.         foreach($params as $k => $v){
  128.             /**
  129.              * Recursive, re-send all values that are arrays
  130.              */
  131.             if(is_array($v)){
  132.                 $params[$k] = $this->realEscapeString($v);
  133.                 continue;
  134.             }
  135.             /**
  136.              * Decode all hexadecimal values (urldecode and html_entity_decode)
  137.              * Clean up all values (strip_tags)
  138.              * Erase all white space before and after string (trim)
  139.              */
  140.             $params[$k] = urldecode($v);
  141.             $params[$k] = html_entity_decode($params[$k]);
  142.             $params[$k] = strip_tags($params[$k]);
  143.             $params[$k] = trim($params[$k]);
  144.         }
  145.  
  146.         return $returnStr ? $params[0] : $params;
  147.     }
  148. }
  149.  
  150. //Uso
  151. $filter = new Filter_Xss();
  152. $values = $filter->filterXss($_POST);
  153. var_dump($values);
  154.  
  155. // Sin HTML
  156. $filter = new Filter_Xss();
  157. $values = $filter->realEscapeString($_POST);
  158. var_dump($values);
  159.  
  160.  
  161. // Filtrar un campo y devolver resultado tipo string
  162. $filter = new Filter_Xss();
  163. $values = $filter->filterXss($_POST['foo'], true);
  164. var_dump($values);
  165.  
  166. // Sin HTML
  167. $filter = new Filter_Xss();
  168. $values = $filter->realEscapeString($_POST['foo'], true);
  169. var_dump($values);
El segundo y tercer campo de realEscapeString son opcionales
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 21/11/2011 a las 08:27
  #8 (permalink)  
Antiguo 21/11/2011, 08:55
Avatar de efedefernan  
Fecha de Ingreso: diciembre-2007
Ubicación: Cantabria
Mensajes: 91
Antigüedad: 16 años, 4 meses
Puntos: 11
Respuesta: funcion para evitar xss sql injection

Una pequeña recomendación a todos para evitar los ataques de inyección sql es que os acostumbreis ha relizar todas las consultas a vuestras bases de datos parametrizadas.

Evitareis que los usuarios sean los responsables de generar codigo dentro de vuestrar consultas.

Un saludo.

Última edición por efedefernan; 21/11/2011 a las 09:32
  #9 (permalink)  
Antiguo 21/11/2011, 11:19
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: funcion para evitar xss sql injection

Cita:
Iniciado por efedefernan Ver Mensaje
Una pequeña recomendación a todos para evitar los ataques de inyección sql es que os acostumbreis ha relizar todas las consultas a vuestras bases de datos parametrizadas.

Evitareis que los usuarios sean los responsables de generar codigo dentro de vuestrar consultas.

Un saludo.
Eso es correcto, siempre es bueno usar por ejemplo PDO y prepare
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #10 (permalink)  
Antiguo 21/11/2011, 12:15
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: funcion para evitar xss sql injection

abimaelrc esta muy bien el urldecode strip_tags y tal pero a todos les pasa urldecode? .y el urlencode donde esta?
  #11 (permalink)  
Antiguo 21/11/2011, 12:24
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: funcion para evitar xss sql injection

Lo hago para por si la persona escribe el hexadecimal %## de esa forma hago que muestre exactamente lo que representa exactamente
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #12 (permalink)  
Antiguo 21/11/2011, 12:26
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: funcion para evitar xss sql injection

yo el urlencode lo uso para pasar variables por la url y el url decode en la pagina de destino , tu donde lo usas?
  #13 (permalink)  
Antiguo 21/11/2011, 12:29
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: funcion para evitar xss sql injection

Todo eso es para convertir al caracter que representa, urlencode no es necesario usar si sabes el hexadecimal es decir un espacio es %20 y así sucesivamente, no es obligatorio usar urlencode para usar urldecode.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #14 (permalink)  
Antiguo 21/11/2011, 12:30
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: funcion para evitar xss sql injection

no digo eso digo q yo lo uso solamente para urls y te preguntaba q tu donde lo usabas na mas ya seq se pueden usar por separado
  #15 (permalink)  
Antiguo 21/11/2011, 22:48
 
Fecha de Ingreso: septiembre-2011
Mensajes: 73
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: funcion para evitar xss sql injection

Buenas Abimaelrc,
Agradecerte tu intervención, indicarte que la aspiración de todo forero es
tener una aclaración a sus dudas por parte de uno de vosotros (lo que yo llamo cariñosamente "Los Bichos") puesto que denotan gran experiencia y nos muestran como manejar el código de la forma optima.

Pero por otro lado, y principalmente por falta de estudio (que intentemos ir compaginando), se nos siguen planteando dudas y aún y que nos gustaría evitar ser "cansinos" caémos en la tentación de que nos resuelvan nuestros problemas.

De tu aporte veo la clase Filter_Xss, veo los dos métodos declarados, no tengo muy claro que ocurre cuando posteriormente en su uso termina produciendose false, no me termino de entender si cuando lo utilizas $values = $filter->realEscapeString($_POST); aplica el filtro para todas las variables recibidas por $_post o bien para la que se solicita y ya cuando habláis de PDO y prepare me digo ¡¡ostias y si no controlo lo del PDO podré terminar mi proyecto sin tener que replantearlo!!, se que finalmente tendré que replanterlo pero necesito sacarlo y verle le cara, esperando tener tiempo posteriormente para vestirlo mejor...

En mis dudas no he querido ser concreto porque voy a intentar entenderlo por mi solito (soy de los del autoaprendizaje !que cosa mas dura!!!) y si no consigo salir para adelante os vuelvo a preguntar....en fin que solo quería daros las GRACIAS!!

Etiquetas: mysql_real_escape_string, seguridad, sql_injection, xss
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:30.