Autor Tema: Prevenir ataques de inyeccion SQL  (Leído 7449 veces)

programador independiente

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 58
    • Ver Perfil
Prevenir ataques de inyeccion SQL
« en: 25 de Septiembre 2014, 16:33 »
Buen día compañeros.

Expongo mi caso:

Hace como una semana, buscando respuesta a un problemilla que traía con el código que pondré al final de estas líneas; problema que consistía en la funcionalidad correcta de una paginación y que me ha resuelto mi amigo y compañero nuestro: dongo a quien doy todo el crédito del buen desempeño en gran parte de mi proyecto (saludos amigo dongo), "dejo el link del tema que abrí respecto a este tema de la paginación, por si acaso a alguien le pueda servir: https://www.aprenderaprogramar.com/foros/index.php?topic=1291.0"
como decía buscando una respuesta, alguien que vio mi código me comentó lo siguiente, cito textualmente:

"viendo tu codigo muy por arriba encontre esto. No va a solucionar tu problema actual pero si los futuros:

$_pagi_sql .= " AND propiedades.colonia LIKE '%" . $_POST['txtBusqueda'] . "%' ";

El problema es: ¿que pasa si envio un POST con código sql en la variable txtBusqueda? podria jugar con tu base de datos, leer, escribir, borrar, etc.

Tenes que sanitizar todas las entradas de datos siempre, ya que pueden escribir codigo por error o a proposito."


Ahora bien, yo he sustituido esa parte específica del $_POST  por  $_GET, no por este tema, sino por el tema de la paginación y mi código ha quedado así, al final haré mis preguntas:

Código: [Seleccionar]
<section id="contenedor_buscador">
    <aside id="izquierda">
<h4>Buscar Propiedades de Nuevo Le&oacute;n</h4><br>
<form id="form_buscar" name="form1" method="GET" action="busca_grand_nl.php">
<label>B&uacute;squeda por Colonia:</label>
<input type="text" name="txtBusqueda" id="txtBusqueda"><br>
<label>Elija Municipio*:</label>
<select name="selCiudad" id="selCiudad">
<option value="-1" selected>Ver todas las Propiedades</option>
<?php
$tablaciudades mysql_query("SELECT * FROM municipios_nuevo_leon ORDER BY nombre_mun ASC"); // Seleccionamos las ciudades de la tabla ciudades
while ($registrociudad mysql_fetch_array($tablaciudades)) { // Vamos a repetir una Option (opcion), de la Lista Desplegable, por cada ciudad en la tabla
?>

<option value="<?php echo $registrociudad['id_mun']; ?>"><?php echo $registrociudad['nombre_mun']; ?></option>
<?php
// termina la zona de repeticion
mysql_free_result($tablaciudades); // se libera la memoria usada por la tabla
?>

</select><br>

<input type="submit" name="cmdBuscar" id="cmdBuscar" value="&nbsp;Buscar&nbsp;">
</form>

<label id="asterisco">Los campos marcados con (*) son obligatorios</label>
</aside>
<article id="derecha">
<h2>Resultados de su b&uacute;squeda</h2>
<?php
$_pagi_sql "SELECT propiedades.*, municipios_nuevo_leon.* FROM propiedades, municipios_nuevo_leon WHERE propiedades.id_mun = municipios_nuevo_leon.id_mun ";
if (isset($_GET['txtBusqueda'])) {
$_pagi_sql .= " AND propiedades.colonia LIKE '%" $_GET['txtBusqueda'] . "%' ";
if (intval($_GET['selCiudad']) > 0) {
$_pagi_sql .= " AND propiedades.id_mun = '" intval($_GET['selCiudad']) . "'";
}
}
$_pagi_sql .= " ORDER BY municipios_nuevo_leon.nombre_mun ASC";
//inicio de código para paginacion
$_pagi_conteo_alternativo=true;
$_pagi_cuantos 6;
include("paginator.inc.php");
//fin de código para paginacion

$tabla mysql_query($_pagi_sql);

/*de aqui hasta el "else{" es el codigo para poner el mensaje de "no se encontraron resultados y el "}" que cierra esta al final, despues de "mysql_close($conexion);".*/
$num_filas=mysql_num_rows($tabla);
if($num_filas==0){
echo "<center>No se encontraron resultados para su b&uacute;squeda</center>";
}
else{ //inicio de código para paginacion aqui se cambio ($tabla)) por ($_pagi_result))
while ($registro mysql_fetch_array($_pagi_result)) 
{
?>


<?php $id $registro['id_dir'];?><!--En esta línea del código va entre corchetes el id de la tabla propiedades-->


<div class="propiedades">
<img id="img_array"src="<?php echo $registro['imagen'];?>"/><br><br>
<label>Direccion:<?php echo $registro['direccion']; ?></label><br>
<label>Colonia:<?php echo $registro['colonia']; ?></label><br>
<label>Municipio:<?php echo $registro['municipio']; ?></label><br>
<label>Estado:<?php echo $registro['estado']; ?></label><br>
<label>Estatus:<?php echo $registro['estatus']; ?></label><br>
<img id="img_precio" src="../img/etiqueta_precio.png"/><label id="precio"><?php echo $registro['precio'];?></label><br>
<a href="detalles_nl.php?id_dir=<?php echo $id?>"><img id="img_llave" class="fade" src="../img/llave_detalle.png"/></a><label id="llave">Ver Detalles</label>
</div>

<?php
}
?>

<!--inicio de código para paginacion-->
<?php echo"<br><div class='barra-navegacion'><p>".$_pagi_navegacion."</p></div>"?>
<!--fin de código para paginacion-->
<?php
mysql_free_result($tabla);
mysql_close($conexion);
}
?>


</article>
</section>

Mis preguntas son:
Cómo sanitizar las entradas de datos en mi código?
Cómo puedo prevenir ataques de inyeccion SQL en mi DB?
Dónde aprender lo necesario para evitar estos ataques?

Buen día a todos compañeros y amigos. Dios les Bendiga y Conserve la Salud.
« Última modificación: 25 de Septiembre 2014, 16:40 por programador independiente »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:Prevenir ataques de inyeccion SQL
« Respuesta #1 en: 28 de Septiembre 2014, 10:32 »
Hola, mira lo que se comenta aquí, quizás te pueda ayudar

https://www.aprenderaprogramar.com/foros/index.php?topic=398

programador independiente

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 58
    • Ver Perfil
Re:Prevenir ataques de inyeccion SQL
« Respuesta #2 en: 03 de Octubre 2014, 17:58 »
Saludos compañero ogramar.

He leído el enlace que me has dejado y me da una idea de cómo empezar a entender esto de los ataques por inyeccion SQL.

En ese enlace el compañero "nosferacento" le indica a "eva" lo siguiente:

"Una vez logres entrar, establecer la medida para evitar el ataque. Para ello puedes usar condicionales if, o bien funciones propias de sql que sirven para limpiar cadenas de caracteres especiales (con lo que en teoría se evitaría la inyección) como mysql_real_escape_string o mysqli::escape_string,"

me parece que voy a comenzar con esto:

1. uso de condicionales if para prevenir ataques.
2. cómo limpiar cadenas de caracteres especiales.
3. investigar todo lo relacionado con la funcion:
   ·mysql_real_escape_string (la cual es la indicada para mi caso).

Muchas gracias compañero ogramar por esta ayuda que me has dado.

Alguna recomendación que me otorgues como añadido respecto a la forma de comenzar a encarar este tema será bienvenida y agradecida.

Saludos compañero Dios te Bendiga y te Conserve la Salud.

PD: Cuando haya sanitizado de buena forma el código, volveré aquí y lo colocaré para ejemplo de alguien a quien pueda servirle, saludos y muchas gracias por todo.
« Última modificación: 03 de Octubre 2014, 18:03 por programador independiente »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:Prevenir ataques de inyeccion SQL
« Respuesta #3 en: 04 de Octubre 2014, 13:20 »
No sé si te servirá, pero esta información es buena: https://www.securecoding.cert.org/confluence/display/jg/07.+Prevent+code+injection

El problema es que está en inglés y es sobre java, pero quizás te puede dar buenas pistas.

Salu2

programador independiente

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 58
    • Ver Perfil
Re:Prevenir ataques de inyeccion SQL
« Respuesta #4 en: 06 de Octubre 2014, 00:26 »
Muchas gracias compañero Ogramar.

Ni hablar tendré que ponerme a traducir  :o.

Gracias ya expondré los resultados, saludos.

Dios te Bendiga y te Conserve la Salud.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".