Les enseñare como evitar inyeciones sql es sus scripts PHP
veamos un ejemplo de consulta a MySQL mediante PHP
<?php
/*
Sdndiego.com SQL Injection
*/
// ----- CONFIG -------
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$dbname = 'injection';
// --------------------
$user = $_GET['id'];
if(empty($user)){
$user = 1;
}
$db = mysql_connect($host, $dbuser, $dbpass);
mysql_select_db($dbname,$db);
$sql = mysql_query("SELECT * FROM `users` WHERE id=".$user) or die (mysql_error());
$users = @mysql_fetch_row($sql);
echo "<h2><center><u>MySQL Injection TEST<br>Sdmdiego.com</u><br><br>";
echo "<font color='#FF0000'>user_id: </font>".$users[0]."<br>";
echo "<font color='#FF0000'>username: </font>".$users[1]."<br>";
echo "<font color='#FF0000'>country: </font>".$users[3]."<br>";
mysql_close($db);
?>
Atencion:
[…]
$user = $_GET['id'];
[…]
$sql = mysql_query("SELECT * FROM `users` WHERE id=".$user)or die (mysql_error());
[…]
Como podemos ver La variable $user no se modifica correctamente antes de ser utilizada en la
consulta, por lo que por esa variable podemos inyectar nuestro código
SQL malicioso.
index.php?id=1 and 1=1 …
y obtener datos de las tablas de la base de datos lo cual ningun webmaster quiere… para evitar dicha vulnerabilidad hagamos lo siguiente
Si el dato que esperamos en una variable es numérico, lo más rápido y sencillo
es hacer esto:
[…] $user = (int)$_GET['id']; […]
lo que hace es que si se introduce otro dato que no sea un numero no mostrara nada.
usando str_replace:
[…]
$user = $_GET['id'];
$user = str_replace("select","123456789",$user);
[…]
Si en la variable $user se encuentra la palabra “select”, lo sustituirá por
“123456789”, así el atacante no podrá realizar la consulta correctamente.
Podemos poner más expresiones regulares que detecten otras palabras
reservadas del lenguaje SQL.
Inspirado en el paper de un amigo {Ka0x}