Cita de: CICOLO_111234 en 19 Abril 2009, 16:16 PM
hola!
tengo este codigo:Código [Seleccionar]
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.