como evitar la inyeccion sql

Iniciado por CICOLO_111234, 19 Abril 2009, 16:16 PM

0 Miembros y 1 Visitante están viendo este tema.

CICOLO_111234

hola!

tengo este codigo:

if (isset($_GET['ID'])) {
  $colname_Recordset1 = (get_magic_quotes_gpc()) ? $_GET['ID'] : addslashes($_GET['ID']);
}
mysql_select_db($database_prueba, $prueba);
$query_Recordset1 = sprintf("SELECT * FROM noticias WHERE ID = %s", $colname_Recordset1);


y me gustaria como evitar la inyeccion sql.

salu2


WHK

Cita de: CICOLO_111234 en 19 Abril 2009, 16:16 PM
hola!

tengo este codigo:

if (isset($_GET['ID'])) {
  $colname_Recordset1 = (get_magic_quotes_gpc()) ? $_GET['ID'] : addslashes($_GET['ID']);
}
mysql_select_db($database_prueba, $prueba);
$query_Recordset1 = sprintf("SELECT * FROM noticias WHERE ID = %s", $colname_Recordset1);


y me gustaria como evitar la inyeccion sql.

salu2

Eso tiene sql inyección ya que el addslashes solo agrega slashses a carácteres que puedan influir en la query, en este caso reemplazaría las comillas dobles y simples pero en el ejemplo que tu pusiste no se necesita una comilla para lanzar la sql inyección.


Código (php) [Seleccionar]

$_GET['ID'] = '-1 union select 1,concat(shell_en_dword),3 into outfile test.php --';

if (isset($_GET['ID'])) {
  $colname_Recordset1 = (get_magic_quotes_gpc()) ? $_GET['ID'] : addslashes($_GET['ID']);
}
mysql_select_db($database_prueba, $prueba);
$query_Recordset1 = sprintf("SELECT * FROM noticias WHERE ID = %s", $colname_Recordset1);


Para poder evitar esto necesitas encerrar el valor entre comillas y de todas formas tendrías problemas con los slashses asi que simplemente puedes utilizar mysql_real_escape_string:
Código (php) [Seleccionar]

if(isset($_GET['ID'])) $colname_Recordset1 = $_GET['ID']; else die('No hay valor');

mysql_select_db($database_prueba, $prueba);
$query_Recordset1 = sprintf("SELECT * FROM noticias WHERE ID = '%s'", mysql_real_escape_string($colname_Recordset1));


O también:
Código (php) [Seleccionar]

if(isset($_GET['ID'])) $colname_Recordset1 = $_GET['ID']; else die('No hay valor');

mysql_select_db($database_prueba, $prueba);
$query_Recordset1 = 'SELECT * FROM noticias WHERE ID = \''.mysql_real_escape_string($colname_Recordset1.'\'';


Ahra si ID es un valor numérico puedes hacer:
Código (php) [Seleccionar]

if(isset($_GET['ID'])) $colname_Recordset1 = $_GET['ID']; else die('No hay valor');

mysql_select_db($database_prueba, $prueba);
$query_Recordset1 = 'SELECT * FROM noticias WHERE ID = '.(int)$colname_Recordset1;


O también:

Código (php) [Seleccionar]

if(isset($_GET['ID'])) $colname_Recordset1 = $_GET['ID']; else die('No hay valor');

mysql_select_db($database_prueba, $prueba);
$query_Recordset1 = 'SELECT * FROM noticias WHERE ID = '.(int)preg_replace('|[^0-9.]|i', '', $colname_Recordset1);

De esta forma tomará carácteres válidos y no devolverá error si realmente hay un valor numérico.