elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Impidir ataques sql.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Impidir ataques sql.  (Leído 2,067 veces)
P[i]


Desconectado Desconectado

Mensajes: 472


Ver Perfil
Impidir ataques sql.
« en: 4 Febrero 2008, 16:00 pm »



  Bueno, estoy haciendo una aplicacion web para clase , un proyecto final, y el sabado estuve mirando un problema con sql y las inyecciones. Me di cuenta que cualquier inyeccion de un campo texto por ejemplo un nombre o contraseña o algo por el estilo no se puede hacer contra php porque este sustituye ' o " por \' o  \" pero claro y si los campos son numericos asi que me puse a investigar y mi aplicacion tenia un bug enorme podia hacer cualquier cosa por eso e creado dos funciones que lo primero os puedan ayudar a vosotros y segundo que me digais si despues de pasar por esta funcion aun habria alguna posibilidad de inyeccion sql. Las funciones son estas en cuestion:
Código:
<?php 

  function sql_seguro($valor)
{
  /*Remplazamos < > para que no inserten codigo estilo <?php ...ataque... ?>*/
$valor = str_replace("<","&lt;",$valor);
  $valor = str_replace(">","&gt;",$valor);

/*palabras que pueden generar problemas*/
$valor = str_replace('INSERT','[INSERT]',$valor);
$valor = str_replace('REPLACE','[REPLACE]',$valor);
$valor = str_replace('UPDATE','[UPDATE]',$valor);
$valor = str_replace('DELETE','[DELETE]',$valor);
$valor = str_replace('SELECT','[SELECT]',$valor);
$valor = str_replace('TRUNCATE','[TRUNCATE]',$valor);
$valor = str_replace('CREATE','[CREATE]',$valor);
$valor = str_replace('DROP','[DROP]',$valor);
$valor = str_replace('SET','[SET]',$valor);
$valor = str_replace(';','[;]',$valor);
$valor = str_replace('"','["]',$valor);
$valor = str_replace("'","[']",$valor);

return $valor;
}

function sql_noseguro($valor)
{
/*palabras que pueden generar problemas*/
$valor = str_replace('[INSERT]','INSERT',$valor);
$valor = str_replace('[REPLACE]','REPLACE',$valor);
$valor = str_replace('[UPDATE]','UPDATE',$valor);
$valor = str_replace('[DELETE]','DELETE',$valor);
$valor = str_replace('[SELECT]','SELECT',$valor);
$valor = str_replace('[TRUNCATE]','TRUNCATE',$valor);
$valor = str_replace('[CREATE]','CREATE',$valor);
$valor = str_replace('[DROP]','DROP',$valor);
$valor = str_replace('[SET]','SET',$valor);
$valor = str_replace('[;]',';',$valor);
$valor = str_replace('["]','"',$valor);
$valor = str_replace("[']","'",$valor);

return $valor;
}

?>

  Tras pasarlo por la primera funcion hay alguna posibilidad de que se pudiera hacer algun ataque sql?????. La segunda funcion  e solo para cuando lo rescatas de la bd que vuelva a estar como antes por si coincide con algo que haya metido el usuario sin malicia.

  Gracias.


En línea

Red Mx
Rojito
Colaborador
***
Desconectado Desconectado

Mensajes: 3.649


Viva México Cabrones...


Ver Perfil WWW
Re: Impidir ataques sql.
« Respuesta #1 en: 4 Febrero 2008, 16:05 pm »

y si por ejemplo en ves de INSERT le pongo InSerT de todas formas es valido y me brinco la limpieza.


hace tiempo azielito puso una funcion muy buena para eso de SQl injection sirve  por GET o POST

Código
  1. # Funcion para limpiar caracte-
  2. # res que pudieran comprometer
  3. # al servidor y/o al usuario
  4. function limpia($var){
  5. $var = strip_tags($var);
  6. $malo = array("\\",";","\'","'","*",";"); // Aqui poner caracteres no permitidos
  7. $i=0;$o=count($malo);
  8. while($i<=$o){
  9. $var = str_replace($malo[$i],"",$var);
  10. $i++;
  11. }
  12. return $var;
  13. }
  14.  
  15. # Funcion que aplica la funcion anterior
  16. # para no tener que preocuparnos por
  17. # ataques de XSS o SQLi
  18. function LimpiarTodo($datos){
  19. if(is_array($datos)){
  20. $datos = array_map('limpia',$datos);
  21. }else{
  22. die("<font color=#ff0000><b>Error:</b></font> La funcion <b>LimpiarTodo</b> debe contener un arreglo.");
  23. }
  24. return $datos;
  25. }
  26. if($_POST){
  27. $_POST =& LimpiarTodo($_POST);
  28. }
  29. if($_GET){
  30. $_GET =& LimpiarTodo($_GET);
  31. }
  32.  

podrias guardarlo como  limpia.php y luego incluirlo antes de cada web donde manejes bases de datos

ejemplo
Código
  1. <?php
  2. include('limpia.php');
  3.  
  4. // sentencias SQL
  5.  
  6.  
  7. /**/
  8.  
  9.  
  10.  
  11. ?>


« Última modificación: 4 Febrero 2008, 16:10 pm por Red Mx » En línea

Desarrollar Malware Es Causa De Cancer...
Casidiablo
Desarrollador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.919



Ver Perfil WWW
Re: Impidir ataques sql.
« Respuesta #2 en: 5 Febrero 2008, 17:56 pm »

He visto un código muy bueno, que es el que implementan los foros SMF... la cosa va más o menos así:

Código
  1. function db_query($db_string, $file, $line)
  2. {
  3. global $db_cache, $db_count, $db_connection, $db_show_debug, $modSettings;
  4.  
  5. // One more query....
  6. $db_count = !isset($db_count) ? 1 : $db_count + 1;
  7.  
  8. // Debugging.
  9. if (isset($db_show_debug) && $db_show_debug === true)
  10. {
  11. // Initialize $db_cache if not already initialized.
  12. if (!isset($db_cache))
  13. $db_cache = array();
  14.  
  15. if (!empty($_SESSION['debug_redirect']))
  16. {
  17. $db_cache = array_merge($_SESSION['debug_redirect'], $db_cache);
  18. $db_count = count($db_cache) + 1;
  19. $_SESSION['debug_redirect'] = array();
  20. }
  21.  
  22. $db_cache[$db_count]['q'] = $db_string;
  23. $db_cache[$db_count]['f'] = $file;
  24. $db_cache[$db_count]['l'] = $line;
  25. $st = microtime();
  26. }
  27.  
  28. // First, we clean strings out of the query, reduce whitespace, lowercase, and trim - so we can check it over.
  29. if (empty($modSettings['disableQueryCheck']))
  30. {
  31. $clean = '';
  32. $old_pos = 0;
  33. $pos = -1;
  34. while (true)
  35. {
  36. $pos = strpos($db_string, '\'', $pos + 1);
  37. if ($pos === false)
  38. break;
  39. $clean .= substr($db_string, $old_pos, $pos - $old_pos);
  40.  
  41. while (true)
  42. {
  43. $pos1 = strpos($db_string, '\'', $pos + 1);
  44. $pos2 = strpos($db_string, '\\', $pos + 1);
  45. if ($pos1 === false)
  46. break;
  47. elseif ($pos2 == false || $pos2 > $pos1)
  48. {
  49. $pos = $pos1;
  50. break;
  51. }
  52.  
  53. $pos = $pos2 + 1;
  54. }
  55. $clean .= ' %s ';
  56.  
  57. $old_pos = $pos + 1;
  58. }
  59. $clean .= substr($db_string, $old_pos);
  60. $clean = trim(strtolower(preg_replace(array('~\s+~s', '~/\*!40001 SQL_NO_CACHE \*/~', '~/\*!40000 USE INDEX \([A-Za-z\_]+?\) \*/~'), array(' ', '', ''), $clean)));
  61.  
  62. // We don't use UNION in SMF, at least so far.  But it's useful for injections.
  63. if (strpos($clean, 'union') !== false && preg_match('~(^|[^a-z])union($|[^[a-z])~s', $clean) != 0)
  64. $fail = true;
  65. // Comments?  We don't use comments in our queries, we leave 'em outside!
  66. elseif (strpos($clean, '/*') > 2 || strpos($clean, '--') !== false || strpos($clean, ';') !== false)
  67. $fail = true;
  68. // Trying to change passwords, slow us down, or something?
  69. elseif (strpos($clean, 'sleep') !== false && preg_match('~(^|[^a-z])sleep($|[^[a-z])~s', $clean) != 0)
  70. $fail = true;
  71. elseif (strpos($clean, 'benchmark') !== false && preg_match('~(^|[^a-z])benchmark($|[^[a-z])~s', $clean) != 0)
  72. $fail = true;
  73. // Sub selects?  We don't use those either.
  74. elseif (preg_match('~\([^)]*?select~s', $clean) != 0)
  75. $fail = true;
  76.  
  77. if (!empty($fail))
  78. {
  79. log_error('Hacking attempt...' . "\n" . $db_string, $file, $line);
  80. fatal_error('Hacking attempt...', false);
  81. }
  82. }
  83.  
  84. $ret = mysql_query($db_string, $db_connection);
  85. if ($ret === false && $file !== false)
  86. $ret = db_error($db_string, $file, $line);
  87.  
  88. // Debugging.
  89. if (isset($db_show_debug) && $db_show_debug === true)
  90. $db_cache[$db_count]['t'] = array_sum(explode(' ', microtime())) - array_sum(explode(' ', $st));
  91.  
  92. return $ret;
  93. }

El modo de uso es simple, por ejemplo:

Código
  1. db_query("InsERT into TABLA values ('bla', 'Jojojo', '$variable')" , __FILE__, __LINE__)

Es muy bueno para echarle un ojo y aprender.

Un saludo!
« Última modificación: 5 Febrero 2008, 17:58 pm por Casidiablo » En línea

P[i]


Desconectado Desconectado

Mensajes: 472


Ver Perfil
Re: Impidir ataques sql.
« Respuesta #3 en: 6 Febrero 2008, 19:32 pm »

Gracias a los dos, me voy a poner a estudiarlos para crear la mia propia.
Saludos.
En línea

Azielito
no es
Colaborador
***
Desconectado Desconectado

Mensajes: 9.188


>.<


Ver Perfil WWW
Re: Impidir ataques sql.
« Respuesta #4 en: 7 Febrero 2008, 18:57 pm »

Lo que he hecho ultimamente es conectar con usuario de solo lectura en aplicaciones de consulta, o sea, algo asi como tipo, blogs y todo eso, y ademas darle acceso (al usuario) solo a las tablas que se necesitan, generalmente la de usuarios no la ocupamos para eso, de esa forma, aun que salten el filtro que hagas no podran hacer mucho :D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ataques en red LAN
Foro Libre
baddev 4 2,417 Último mensaje 13 Abril 2021, 06:54 am
por baddev
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines