Foros del Web » Programando para Internet » PHP »

Como evitar que el usuario establezca la ruta donde hacer fwrite();

Estas en el tema de Como evitar que el usuario establezca la ruta donde hacer fwrite(); en el foro de PHP en Foros del Web. Hola, estoy realizando un sistema de artículos. Tengo ya la base que es esta: Código PHP: <?php $mensaje_error  =  "" ; if ( $_SERVER [ 'REQUEST_METHOD' ...
  #1 (permalink)  
Antiguo 21/07/2011, 02:50
 
Fecha de Ingreso: abril-2011
Ubicación: España, Mdrid
Mensajes: 89
Antigüedad: 13 años, 8 meses
Puntos: 1
Como evitar que el usuario establezca la ruta donde hacer fwrite();

Hola, estoy realizando un sistema de artículos. Tengo ya la base que es esta:

Código PHP:
<?php
$mensaje_error 
"";
if (
$_SERVER['REQUEST_METHOD'] == 'POST')

{
    
   
$accion = isset($_POST['accion']) ? $_POST['accion'] : '';
    
$base_datos $_POST['titulo'];

   if (
$accion == 'crear_articulo')
   {
        
        
$base_datos $_POST['titulo'];
        
$nuevo_articulo $_POST['articulo'];
        
        
    }
    if (empty(
$mensaje_error))
   {
         
$archivo fopen($base_datos'a');
         
fwrite($archivo$nuevo_articulo);
         
   }
   }
         
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" >
<link rel="stylesheet" type="text/css" href="../estilos/estiloarticulos.css"></link>
<title>Musicaendo - Nuevo artículo</title>
</head>
<body>
<!-- CABEZA -->
<div id="cabecero">
<div id="menu">
<div id="tabla">
    <ul>
<li><a href="http://www.forosdelweb.com/f18/opciones/index.php" >Opciones</a></li>    
<li><a href="estadisticas.php" >Estadísticas</a></li>    
    </ul>
</div>
</div>
<div id="menu2">
<div id="tabla2">
    <ul>
<li><a href="login.php" id="especial">Iniciar sesión</a></li>     
    </ul>
</div>
</div>
</div>
<div id="contenido">
<div id="herramienta">
<div class="margen">
<div id="div_articulo">
<form name="crear_articulo" method="post" action="<?php echo basename(__FILE__); ?>" id="crear_articulo">
<input type="hidden" name="accion" value="crear_articulo">
<table cellspacing="4" cellpadding="0" >
<tr>
  <td colspan="2" align="center" > <b>Nuevo artículo</b></td>
</tr>
<tr>
   <td align="right" >Título:</td>
   <td align="left"><input type="text" name="titulo"></td>
</tr>
<tr>
   <td align="right" >Artículo:</td>
   <td align="left"><textarea name="articulo"></textarea></td>
</tr>
<tr>
   <td colspan="2"><?php echo $mensaje_error?></td>
</tr>
<tr>
   <td>&nbsp;</td><td align="left" valign="bottom"><input type="submit" name="crear_articulo" value="¡Enviar!" id="crear_articulo"></td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
Lo malo es que el usuario puede establecer la ruta donde quiere guardar el archivo mediante el input titulo, me gustaría que yo pudiera establecer la ruta y la extensión y que el usuario solo pudiese meter el titulo y nada más.

Última edición por GuillermoM; 21/07/2011 a las 03:03 Razón: Código errorneo
  #2 (permalink)  
Antiguo 21/07/2011, 05:06
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 9 meses
Puntos: 253
Respuesta: Como evitar que el usuario establezca la ruta donde hacer fwrite();

Cómo que el usuario puede poner la ruta en título? Si te refieres a que pueda insertar "Ruta/de/articulo/título" en el campo título, lo único que tienes que controlar es que no metas el caracter "/".

Con stripos puedes comprobarlo:
Código PHP:
if (stripos("/"$titulo)) {
    echo 
"título NO permitido";
} else {
    echo 
"título permitido";

Un saludo.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?
  #3 (permalink)  
Antiguo 21/07/2011, 05:58
 
Fecha de Ingreso: abril-2011
Ubicación: España, Mdrid
Mensajes: 89
Antigüedad: 13 años, 8 meses
Puntos: 1
Respuesta: Como evitar que el usuario establezca la ruta donde hacer fwrite();

Bueno, creo que ya está, no lo he solucionado, los usuarios siguen pudiendo establecer la ruta del archivo pero no lo saben. Jejeje es pero que nadie lo descubra.

Ahí va el código con las modificaciones.

Código PHP:
<?php
session_start
();
$mensaje_error "";
if (
$_SERVER['REQUEST_METHOD'] == 'POST')

{
    
   
$accion = isset($_POST['accion']) ? $_POST['accion'] : '';
    
$base_datos "../articulos/articulos/".$_POST['titulo'].".html";
    
$pagina_sucesos "../articulos/";
   if (
$accion == 'crear_articulo')
   {
        
        
$base_datos "../articulos/articulos/".$_POST['titulo'].".html";
        
$nuevo_articulo $_POST['articulo'];
        
$nuevonombre_usuario $_SESSION['nombre_usuario'];

        
$elementos file($base_datos);
      foreach(
$elementos as $enlinea)
      {
         list(
$nombre_usuario$articulo) = explode('|'trim($enlinea));
         
         if (
$nuevonombre_usuario == $nombre_usuario)
         {
            
$mensaje_error 'Tu nombre de usuario ya está en uso. Por favor, prueba con otro.';
            break;
         }
      }
      if (empty(
$mensaje_error))
      {
         
$archivo fopen($base_datos'a');
         
fwrite($archivo$nuevonombre_usuario);
            
fwrite($archivo'|');
         
fwrite($archivo$nuevo_articulo);
         
fwrite($archivo"\r\n");
         
fclose($archivo);

         
header('Location: '.$pagina_sucesos);
         exit;
         
            }
   }
}
         
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" >
<link rel="stylesheet" type="text/css" href="../estilos/estiloarticulos.css"></link>
<title>Musicaendo - Nuevo artículo</title>
</head>
<body>
<!-- CABEZA -->
<div id="cabecero">
<div id="menu">
<div id="tabla">
    <ul>
<li><a href="../opciones/index.php" >Opciones</a></li>    
<li><a href="estadisticas.php" >Estadísticas</a></li>    
    </ul>
</div>
</div>
<div id="menu2">
<div id="tabla2">
    <ul>
<li><a href="login.php" id="especial">Iniciar sesión</a></li>     
    </ul>
</div>
</div>
</div>
<div id="contenido">
<div id="herramienta">
<div class="margen">
<div id="div_articulo">
<form name="crear_articulo" method="post" action="<?php echo basename(__FILE__); ?>" id="crear_articulo">
<input type="hidden" name="accion" value="crear_articulo">
<table cellspacing="4" cellpadding="0" >
<tr>
  <td colspan="2" align="center" > <b>Nuevo artículo</b></td>
</tr>
<tr>
   <td align="right" >Usuario:</td>
   <td align="left">
   <?php echo $_SESSION['nombre_usuario']; ?>
   </td>
</tr>
<tr>
   <td align="right" >Título:</td>
   <td align="left"><input type="text" name="titulo" value=""></td>
</tr>
<tr>
   <td align="right" >Artículo:</td>
   <td align="left"><textarea name="articulo"></textarea></td>
</tr>
<tr>
   <td colspan="2"><?php echo $mensaje_error?></td>
</tr>
<tr>
   <td>&nbsp;</td><td align="left" valign="bottom"><input type="submit" name="crear_articulo" value="¡Enviar!" id="crear_articulo"></td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
  #4 (permalink)  
Antiguo 21/07/2011, 05:58
 
Fecha de Ingreso: abril-2011
Ubicación: España, Mdrid
Mensajes: 89
Antigüedad: 13 años, 8 meses
Puntos: 1
Respuesta: Como evitar que el usuario establezca la ruta donde hacer fwrite();

Cita:
Iniciado por vgonga1986 Ver Mensaje
Cómo que el usuario puede poner la ruta en título? Si te refieres a que pueda insertar "Ruta/de/articulo/título" en el campo título, lo único que tienes que controlar es que no metas el caracter "/".

Con stripos puedes comprobarlo:
Código PHP:
if (stripos("/"$titulo)) {
    echo 
"título NO permitido";
} else {
    echo 
"título permitido";

Un saludo.
Muchas gracias. Te debo una.
  #5 (permalink)  
Antiguo 21/07/2011, 06:05
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 9 meses
Puntos: 253
Respuesta: Como evitar que el usuario establezca la ruta donde hacer fwrite();

Cita:
Iniciado por GuillermoM Ver Mensaje
Muchas gracias. Te debo una.
Acepto jamones en Navidades, solicitar dirección por privado

Un saludo.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?
  #6 (permalink)  
Antiguo 21/07/2011, 06:19
 
Fecha de Ingreso: abril-2011
Ubicación: España, Mdrid
Mensajes: 89
Antigüedad: 13 años, 8 meses
Puntos: 1
Respuesta: Como evitar que el usuario establezca la ruta donde hacer fwrite();

Cita:
Iniciado por vgonga1986 Ver Mensaje
Acepto jamones en Navidades, solicitar dirección por privado

Un saludo.
Jejeje al final use un ereg pero muchas gracias por darme la idea de restringir el "/" de el titulo.

Ahí va acabado el scrip:

Código PHP:

<?php
session_start
();
$mensaje_error "";
if (
$_SERVER['REQUEST_METHOD'] == 'POST')

{
    
   
$accion = isset($_POST['accion']) ? $_POST['accion'] : '';
    
$base_datos "../articulos/articulos/".$_POST['titulo'].".html";
    
$pagina_sucesos "../articulos/motor.php";
   if (
$accion == 'crear_articulo')
   {
        
        
$base_datos "../articulos/articulos/".$_POST['titulo'].".html";
        
$nuevo_articulo $_POST['articulo'];
        
$nuevonombre_usuario $_SESSION['nombre_usuario'];

        if (!
ereg("^[A-Za-z0-9_!@$]{1,50}$"$_POST['titulo']))
      {
      
$mensaje_error 'Título no permitido.';
      }
      
        
$elementos file($base_datos);
      foreach(
$elementos as $enlinea)
      {
         list(
$nombre_usuario$articulo) = explode('|'trim($enlinea));
         
         if (
$nuevonombre_usuario == $nombre_usuario)
         {
            
$mensaje_error 'Tu nombre de usuario ya está en uso. Por favor, prueba con otro.';
            break;
         }
      }
      if (empty(
$mensaje_error))
      {
         
$archivo fopen($base_datos'a');
         
fwrite($archivo$nuevonombre_usuario);
            
fwrite($archivo'|');
         
fwrite($archivo$nuevo_articulo);
         
fwrite($archivo"\r\n");
         
fclose($archivo);

         
header('Location: '.$pagina_sucesos);
         exit;
         
            }
   }
}
         
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" >
<link rel="stylesheet" type="text/css" href="../estilos/estiloarticulos.css"></link>
<title>Musicaendo - Nuevo artículo</title>
</head>
<body>
<!-- CABEZA -->
<div id="cabecero">
<div id="menu">
<div id="tabla">
    <ul>
<li><a href="../opciones/index.php" >Opciones</a></li>    
<li><a href="estadisticas.php" >Estadísticas</a></li>    
    </ul>
</div>
</div>
<div id="menu2">
<div id="tabla2">
    <ul>
<li><a href="login.php" id="especial">Iniciar sesión</a></li>     
    </ul>
</div>
</div>
</div>
<div id="contenido">
<div id="herramienta">
<div class="margen">
<div id="div_articulo">
<form name="crear_articulo" method="post" action="<?php echo basename(__FILE__); ?>" id="crear_articulo">
<input type="hidden" name="accion" value="crear_articulo">
<table cellspacing="4" cellpadding="0" >
<tr>
  <td colspan="2" align="center" > <b>Nuevo artículo</b></td>
</tr>
<tr>
   <td align="right" >Usuario:</td>
   <td align="left">
   <?php echo $_SESSION['nombre_usuario']; ?>
   </td>
</tr>
<tr>
   <td align="right" >Título:</td>
   <td align="left"><input type="text" name="titulo" value=""></td>
</tr>
<tr>
   <td align="right" >Artículo:</td>
   <td align="left"><textarea name="articulo"></textarea></td>
</tr>
<tr>
   <td colspan="2"><?php echo $mensaje_error?></td>
</tr>
<tr>
   <td>&nbsp;</td><td align="left" valign="bottom"><input type="submit" name="crear_articulo" value="¡Enviar!" id="crear_articulo"></td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
  #7 (permalink)  
Antiguo 21/07/2011, 06:24
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 9 meses
Puntos: 253
Respuesta: Como evitar que el usuario establezca la ruta donde hacer fwrite();

Buenas,

ereg está Obsoleto en PHP5. Te recomiendo que utilices perg_match, la sintaxis de la función es la misma, pero en debes encerrar la expresión regular entre signos /:
preg_match("/^[A-Za-z0-9_!@$]{1,50}$/", $_POST['titulo'])

Añade un par de botellitas de un buen Champan francés y quedamos en paz.

Un saludo.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?

Etiquetas: establezca, fwrite();, ruta, usuarios
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 10:19.