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?
Podría ser sin base de datos de esta forma:
<?
if ($_GET['pagina']==1)
{
include('pagina.html');
}
elseif ($_GET['pagina']==2)
{
include('lalala.ototo');
}
...
?>
he visto casos que hacen esto:
<?php
if($_GET['pagina'])
include('inclusiones/'.$_GET['pagina'].'.php');
?>
y no es chiste xD
index.php?pagina=../../imagenes/shell_lfi.jpg%00
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?
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
<?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
<?php
$incluir = 'secciones/'.(int)$_GET['pagina'].'.php';
if(file_exists($incluir))
include($incluir);
else
include('secciones/404.php');
?>
index.php?id_sql=pagina
<?php
$incluir = mysql_query('
select *
from secciones
where sección = \''.mysql_real_escape_string($_GET['pagina']).'\'
', $manejador);
.... mysql_fetch_array($incluir, MYSQL_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:
<?php
if($_GET['pagina'])
include('inclusiones/'.$_GET['pagina'].'.php');
?>
y no es chiste xD
index.php?pagina=../../imagenes/shell_lfi.jpg%00
pnwd XD
Yo estas cosas las veo más claras con un switch que con un elseif aunque funciona igual, yo suelo hacer algo así:
$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í:
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!
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