Como se hacen páginas estilo index.php?pagina=1

Iniciado por jdc, 26 Agosto 2009, 21:50 PM

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

jdc

Pues eso... Me gustaría saber como se fabrican esas urls ya que he buscado pero llegué hasta listados de resultados pero no logró entender como funciona...

Se que en el servidor no están las páginas "pagina=1", "pagina=2", etc... Sino que entiendo que "pagina" sería una variable y "1" sería el valor... Pero como se crea algo así? Sería con php y mysql por obligación o podría ser sin base de datos?

braulio--

Podría ser sin base de datos de esta forma:
Código (php) [Seleccionar]

<?
if ($_GET['pagina']==1)
{
include('pagina.html');
}
elseif ($_GET['pagina']==2)
{
include('lalala.ototo');
}
...
?>

WHK

he visto casos que hacen esto:
Código (php) [Seleccionar]
<?php
if($_GET['pagina'])
 include(
'inclusiones/'.$_GET['pagina'].'.php');
?>

y no es chiste xD
index.php?pagina=../../imagenes/shell_lfi.jpg%00

jdc

Entonces no es seguro usarlo así? Tenía pensado hacer una página con noticias o lo que sea con base de datos donde la base tendría una tabla y cada fila de la tabla se mostraria en una página... Por ahora la seguridad sería postre ya que quiero aprender la forma básica y luego avanzar (incluyendo seguridad claro está) por cierto como se evita el local file included que mencionar WHK?

WHK

#4
para eso hay filtros, por ejemplo puedes usar expresiones regulares para tomar el valor de una pagina o usar (int) sy es numérico y si usas mysql hay filtros como mysql escape real string.
Formas cortrectas:

index.php?pagina=contacto
Código (php) [Seleccionar]
<?php
$incluir 
'secciones/'.preg_replace('|[^A-Za-z0-9_]|i'''$_GET['pagina']).'.php';
if(
file_exists($incluir))
 include(
$incluir);
else
 include(
'secciones/404.php');
?>


index.php?id=9
Código (php) [Seleccionar]
<?php
$incluir 
'secciones/'.(int)$_GET['pagina'].'.php';
if(
file_exists($incluir))
 include(
$incluir);
else
 include(
'secciones/404.php');
?>


index.php?id_sql=pagina
Código (php) [Seleccionar]
<?php
$incluir 
mysql_query('
 select * 
 from secciones 
 where sección = \''
.mysql_real_escape_string($_GET['pagina']).'\'
'
$manejador);
.... 
mysql_fetch_array($incluirMYSQL_ASSOC) .....

if(
file_exists($incluir))
 include(
$incluir);
else
 include(
'secciones/404.php');
?>

дٳŦ٭

Cita de: WHK en 26 Agosto 2009, 22:25 PM
he visto casos que hacen esto:
Código (php) [Seleccionar]
<?php
if($_GET['pagina'])
 include(
'inclusiones/'.$_GET['pagina'].'.php');
?>

y no es chiste xD
index.php?pagina=../../imagenes/shell_lfi.jpg%00

pnwd XD


Con sangre andaluza :)


Spider-Net

Yo estas cosas las veo más claras con un switch que con un elseif aunque funciona igual, yo suelo hacer algo así:

Código (php) [Seleccionar]
$var=filtra($_GET['var']);

switch($var){
    case "principal":
           include("main.php");
           break;

    case "galeria":
           include("gallery.php");
           break;

    case "contacto":
           include("contact.php");
           break;

    default:
           include("error.php");
           break;   
}


Y hago la llamada así: ?var=galeria (por ejemplo)

Siempre uso la función filtra en la que suelo hacer una pasada por funciones para evitar tags html, php, sql injection etc...

Algo así:

Código (php) [Seleccionar]
function filtra($string){
   $string=htmlentities(strip_tags(trim(no_sql($string))));
   return $string;
}


La función no_sql no es propia de PHP pero puedes encontrar muchas anti sql-injection por internet, de hecho por aquí en el foro hay varias.

Un saludo!

jdc

Y la función que posteo WHK también impide un eventual sql inyection no? Elimina otros caracteres que no sean mayúsculas, minúsculas o números por ejemplo en la de página=página