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.
$_GET['ID'] = '-1 union select 1,concat(shell_en_dword),3 into outfile test.php --';
if (isset($_GET['ID'])) { }
$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:
if(isset($_GET['ID'])) $colname_Recordset1 = $_GET['ID']; else die('No hay valor');
O también:
if(isset($_GET['ID'])) $colname_Recordset1 = $_GET['ID']; else die('No hay valor');
Ahra si ID es un valor numérico puedes hacer:
if(isset($_GET['ID'])) $colname_Recordset1 = $_GET['ID']; else die('No hay valor');
$query_Recordset1 = 'SELECT * FROM noticias WHERE ID = '.(int)$colname_Recordset1;
O también:
if(isset($_GET['ID'])) $colname_Recordset1 = $_GET['ID']; else die('No hay valor');
$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.