Foros del Web » Programando para Internet » PHP »

sql inyection en function. cómo resolver

Estas en el tema de sql inyection en function. cómo resolver en el foro de PHP en Foros del Web. Hola. tengo un script en el que acunetix scanner me detecta un fallo de sql inyection. el script es de paginación, venía ya incluído en ...
  #1 (permalink)  
Antiguo 14/07/2011, 15:35
 
Fecha de Ingreso: noviembre-2009
Mensajes: 64
Antigüedad: 14 años, 5 meses
Puntos: 1
sql inyection en function. cómo resolver

Hola. tengo un script en el que acunetix scanner me detecta un fallo de sql inyection.

el script es de paginación, venía ya incluído en un software que estoy probando para aprender a programar, que es una vieja version de b2.

ya he probado el error y efettivamente salta un warning mysql.

basicamente la cuestion es que teniendo una url del tipo

http://url.com/secciones.php?cat=2&paged=X

donde x puede ser el numero de paginas de post publicados en una misma categoría.

pero que también es la puerta para el sql inyection.

entonces, lo que quiero es poder cerrar la puerta, pero aun no he sabido como asi ojala alguien pudiera orientarme.

si consideran que es mejor reemplazar ese script por uno mejor, pues asi lo hare, pero si tiene solución el fallo, pues mejor.

a continuacion pongo el scrpit. hay uno para anterior y otro para siguiente. solo pongo el de siguiente

gracias

saludos

Código PHP:
function next_posts($max_page 0) { // original by cfactor at cooltux.org
    
global $_SERVER$siteurl$blogfilename$p$paged$what_to_show$pagenow;
    global 
$querystring_start$querystring_equal$querystring_separator;
    if (empty(
$p) && ($what_to_show == 'paged')) {
        
$qstr $_SERVER['QUERY_STRING'];
        if (!empty(
$qstr)) {
            
$qstr preg_replace("/&paged=\d{0,}/","",$qstr);
            
$qstr preg_replace("/paged=\d{0,}/","",$qstr);
        } elseif (
stristr($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME'] )) {
            if (
'' != $qstr str_replace($_SERVER['SCRIPT_NAME'], ''
                                            
$_SERVER['REQUEST_URI']) ) {
                
$qstr preg_replace("/^\//"""$qstr);
                
$qstr preg_replace("/paged\/\d{0,}\//"""$qstr);        
                
$qstr preg_replace("/paged\/\d{0,}/"""$qstr);
                
$qstr preg_replace("/\/$/"""$qstr);
            }
        }
        if (!
$paged$paged 1;
        
$nextpage intval($paged) + 1;
        if (!
$max_page || $max_page >= $nextpage) {
            echo  
$pagenow.$querystring_start.

                (
$qstr == '' '' $qstr.$querystring_separator) .
                
'paged'.$querystring_equal.$nextpage;
        }
    }
}


function 
next_posts_link($label='pag. siguiente >>'$max_page=0) {
    global 
$p$paged$result$request$posts_per_page$what_to_show;
    if (
$what_to_show == 'paged') {
        if (!
$max_page) {
            
$nxt_request $request;
            if (
$pos strpos(strtoupper($request), 'LIMIT')) {
                
$nxt_request substr($request0$pos);
            }
            
$nxt_result mysql_query($nxt_request);
            
$numposts mysql_num_rows($nxt_result);
            
$max_page ceil($numposts $posts_per_page);
        }
        if (!
$paged$paged 1;
        
$nextpage intval($paged) + 1;
        if (empty(
$p) && (empty($paged) || $nextpage <= $max_page)) {
            echo 
'<a href="';
            echo 
next_posts($max_page);
            echo 
'">'htmlspecialchars($label) .'</a>';
        }
    }

  #2 (permalink)  
Antiguo 14/07/2011, 15:56
Avatar de iviamontes  
Fecha de Ingreso: enero-2011
Ubicación: $cubano->Arg->Mendoza
Mensajes: 1.184
Antigüedad: 13 años, 3 meses
Puntos: 209
Respuesta: sql inyection en function. cómo resolver

mysql_real_escape_string
y tmb uso para el paginado
is_numeric()
__________________
aconcaguaestudio.com
  #3 (permalink)  
Antiguo 24/07/2011, 10:31
 
Fecha de Ingreso: noviembre-2009
Mensajes: 64
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: sql inyection en function. cómo resolver

Hola. disculpa que hasta ahora responda.

el acunetix dice que hay dos problemas con esta funcion de paginacion

el primero, es que se pueden insertar valores o caracteres diferentes a numeros, y el segundo, que se pueden insertar comillas dobles y asi realizar xss

<a href=""onmouseover=prompt(990955)>?%22onmouseover= prompt(990955)%3E&amp;paged=2">pag. siguiente &gt;&gt;</a>


o sea, que el problema está en esta parte del codigo.

Código PHP:
 $nxt_result mysql_query($nxt_request); 
            
$numposts mysql_num_rows($nxt_result); 
            
$max_page ceil($numposts $posts_per_page); 
        } 
        if (!
$paged$paged 1
        
$nextpage intval($paged) + 1
        if (empty(
$p) && (empty($paged) || $nextpage <= $max_page)) { 
            echo 
'<a href="'
            echo 
next_posts($max_page); 
            echo 
'">'htmlspecialchars($label) .'</a>'
creo que el primer problema, de insertar valores distintos a numeros se solucionaria con is_numeric, como comenta iviamontes.

he buscado informacion al respecto pero no encuentro bien a bien como aplicarla.

$max_page tiene que ser is_numeric... tal vez puedo concatenar otra variable, para hacer algo asi

Código PHP:
 $nxt_result mysql_query($nxt_request); 
            
$numposts mysql_num_rows($nxt_result); 
            
$max_page ceil($numposts $posts_per_page); 
            
$max_pag is_numeric($max_page); 
creo que puede funcionar, voy a probarlo... aunque me parece que no funciona

y tampoco si la uso asi:

Código PHP:
$max_page is_numeric(ceil($numposts $posts_per_page)); 
pero la onda de las comillas no se bien como resolverlo. si uso comilla simple, se cierra el echo, pero donde abro las comillas dobles para el link, aunque tambien los links funcionan con comillas simples

alguna idea??


Código PHP:
 echo '<a href="'
            echo 
next_posts($max_pag); 
            echo 
'">'htmlspecialchars($label) .'</a>'

gracias.

Última edición por Tooj; 24/07/2011 a las 10:41

Etiquetas: function, html, mysql, resolver, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:38.