PHP pregunta de seguridad

  • PolishHurricane
  • Mastermind
  • Mastermind
  • Avatar de Usuario
  • Registrado: Feb 17, 2005
  • Mensajes: 1585
  • Status: Offline

Nota Julio 30th, 2010, 9:35 pm

Im bastante seguro de que esto es totalmente bien, pero por alguna razón estoy paranoico sobre ella ya que no suelen nunca tirar nada sin filtrar en una incluir o hacer algo como esto, pero ¿alguien sabe de cualquier caso en que esto no es seguro y puede ser explotado de alguna manera?

PHP Código: [ Select ]
<?php
$VALID_PAGES = array(
'news' => 'news.php',
'statistics' => 'site_statistics.php'
);
 
if(isset($an_array[$_REQUEST['page']]))
{
require_once($an_array[$_REQUEST['page']]);
}
else
{
require_once('default.php');
}
?>
  1. <?php
  2. $VALID_PAGES = array(
  3. 'news' => 'news.php',
  4. 'statistics' => 'site_statistics.php'
  5. );
  6.  
  7. if(isset($an_array[$_REQUEST['page']]))
  8. {
  9. require_once($an_array[$_REQUEST['page']]);
  10. }
  11. else
  12. {
  13. require_once('default.php');
  14. }
  15. ?>


Yo normalmente uso una sentencia switch para este tipo de cosas con los valores pre-llenado, pero su demasiado largo y yo no lo quiero por otras razones.
There's no place like 127.0.0.1, badass part is now it's ::1
  • Anonymous
  • Bot
  • No Avatar
  • Registrado: 25 Feb 2008
  • Mensajes: ?
  • Loc: Ozzuland
  • Status: Online

Nota Julio 30th, 2010, 9:35 pm

  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13458
  • Loc: Florida
  • Status: Offline

Nota Julio 30th, 2010, 11:15 pm

No es comprobar si $ _REQUEST ["página"] existe antes de usarlo. El código podría exponer una ruta de archivo a través de un aviso de error en función del valor de error_reporting.

¿Tiene algo como esto te hacen pensar de forma diferente?

PHP Código: [ Select ]
<?php
 
$p = empty($_GET['p']) ? 'index' : $_GET['p'];
 
if(strcspn($p, '1234567890-_abcdefghijklmnopqrstuvwxyz'))
{
   $p = 'index';
}
 
if( ! is_readable("/www/lib/$p.php") || ! is_readable("/www/templates/$p.html"))
{
   $p = 'index';
}
 
require_once("/www/lib/$p.php");
 
?>
  1. <?php
  2.  
  3. $p = empty($_GET['p']) ? 'index' : $_GET['p'];
  4.  
  5. if(strcspn($p, '1234567890-_abcdefghijklmnopqrstuvwxyz'))
  6. {
  7.    $p = 'index';
  8. }
  9.  
  10. if( ! is_readable("/www/lib/$p.php") || ! is_readable("/www/templates/$p.html"))
  11. {
  12.    $p = 'index';
  13. }
  14.  
  15. require_once("/www/lib/$p.php");
  16.  
  17. ?>
Strong with this one, the sudo is.
  • PolishHurricane
  • Mastermind
  • Mastermind
  • Avatar de Usuario
  • Registrado: Feb 17, 2005
  • Mensajes: 1585
  • Status: Offline

Nota Julio 31st, 2010, 1:52 am

Pues sí, no es verificar si la solicitud existe en este ejemplo, se omitió esa línea, la teoría más o menos de todos modos.

Nunca he visto que strcspn () que yo recuerde, yo también metido con él, me parece a devolver sólo el int mismo o, a veces la misma entrada, independientemente de si la cadena contiene o no contiene los caracteres, ¿estás seguro de que la función es un filtro fiable? Me parece interesante sin embargo.

llamar a Niza el que is_readable () para el error ruta del archivo. Tengo un montón de páginas de modo que puede ser bueno, pero la pregunta...Es is_readable () es lenta? Im tratando de mantener la carga de las páginas optimizadas.

Gracias un montón Joe
There's no place like 127.0.0.1, badass part is now it's ::1
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13458
  • Loc: Florida
  • Status: Offline

Nota Julio 31st, 2010, 2:24 pm

strcspn puede ser un poco confuso. Regularmente tienen que consultar el manual después de pasar un tiempo sin usarlo porque me strcspn y strspn mezclado porque hacer lo contrario. Aunque tengo una idea para recordar cuál es cuál en este momento y la enfermedad llega a eso más adelante.

strcspn básicamente busca personajes que no están en esa máscara de caracteres. En el manual,

Quote:
strcspn int (string $ cadena1, string $ cadena2 [, int $ comienzo [, int $ longitud]])

Devuelve la longitud del segmento inicial de cad1 que no contiene ninguno de los personajes de str2.


Si a rastrear a la función en la fuente, se llega a esta donde se puede ver cómo funciona internamente la función. Simplemente camina a través de la cadena en busca de algo que no espera, entonces busca algo que no espera y devuelve la longitud de dicho segmento.

etc / standard / string.c: 1571

C Código: [ Select ]
PHPAPI size_t php_strcspn(char *s1, char *s2, char *s1_end, char *s2_end)
{
   register const char *p, *spanp;
   register char c = *s1;
 
   for (p = s1;;) {
      spanp = s2;
      do {
         if (*spanp == c || p == s1_end) {
            return p - s1;
         }
      } while (spanp++ < (s2_end - 1));
      c = *++p;
   }
   /* NOTREACHED */
}
  1. PHPAPI size_t php_strcspn(char *s1, char *s2, char *s1_end, char *s2_end)
  2. {
  3.    register const char *p, *spanp;
  4.    register char c = *s1;
  5.  
  6.    for (p = s1;;) {
  7.       spanp = s2;
  8.       do {
  9.          if (*spanp == c || p == s1_end) {
  10.             return p - s1;
  11.          }
  12.       } while (spanp++ < (s2_end - 1));
  13.       c = *++p;
  14.    }
  15.    /* NOTREACHED */
  16. }


Cualquier devolución strcspn vez que un número distinto de cero, theres su mala disposición en la entrada y que sobrescribir la entrada completa mal con el valor predeterminado. Esto es sólo un simple curso de acción después de encontrar una entrada incorrecta, en realidad, probablemente terminaría en busca de errores posible, comprobar una tabla 301, o algo por el estilo.

Ahora, en cuanto a ese truco para recordar que función hace que he mencionado antes, la enfermedad tienen que pedir prestado un comentario del manual de PHP.

Quote:
strcspn () también puede considerarse como análoga a la siguiente expresión regular:
PHP Código: [ Select ]
<?php
// where ... represents the mask of characters
preg_match('/[^ ...]/', substr($subject, $start, $length) );
?>
  1. <?php
  2. // where ... represents the mask of characters
  3. preg_match('/[^ ...]/', substr($subject, $start, $length) );
  4. ?>


Si mal no recuerdo strcspn y strspn como clases de personajes a partir de expresiones regulares, sólo tengo que recordar que en una clase de caracteres negada existe ese personaje extra "^" y en el nombre de la función strcspn también hay un personaje extra "c".

-

Realmente no puedo decir mucho sobre is_readable, lo uso en el ejemplo, porque el tono de la conversación parece ser la seguridad y el error-prevension-sabio es is_readable menos propenso a los accidentes que algo como file_exists. Yo prefiero usar file_exists. Im bastante bueno sobre la fabricación de seguro que algo va a funcionar antes de que entre en vigor, mediante el uso de valores por defecto como yo Im no va a obtener un error sobre un archivo ilegible, salvo en una falla catastrauphic, y theres ninguna razón para mi para cambiar los permisos de archivos más adelante.
Strong with this one, the sudo is.
  • PolishHurricane
  • Mastermind
  • Mastermind
  • Avatar de Usuario
  • Registrado: Feb 17, 2005
  • Mensajes: 1585
  • Status: Offline

Nota Julio 31st, 2010, 11:24 pm

Maldita sea esa función PHP es confuso. Pensé que me descargado una copia de la fuente de código PHP cuando (si puedo entender la mitad de ella). Me imaginé que debe valer la pena teniendo en cuenta que seguir mostrando que a mí en las discusiones. :)

De todos modos, creo que tenemos un hombre problema. Digamos que tuvo la siguiente secuencia de comandos...

PHP Código: [ Select ]
<?php
$test = $_GET['page'];
echo 'strcspn: '.strcspn($test,'abc');
?>
  1. <?php
  2. $test = $_GET['page'];
  3. echo 'strcspn: '.strcspn($test,'abc');
  4. ?>


Si la página es "abc", entonces el resultado es: 0
Si la página es "dabc", entonces el resultado es: 1
Si la página es "abcd", entonces el resultado es: 0 (Sí, CERO, uh oh)

Así que en realidad no se puede confiar en que para la seguridad con tristeza.
There's no place like 127.0.0.1, badass part is now it's ::1
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13458
  • Loc: Florida
  • Status: Offline

Nota Agosto 1st, 2010, 11:40 am

Bueno, eso es un problema. Me atrevo a decir que incluso parece un error en la función.

¿Qué acerca del uso de strspn en combinación con strlen entonces?

PHP Código: [ Select ]
if(strlen($str) == strspn($str, 'abc'))
Strong with this one, the sudo is.
  • PolishHurricane
  • Mastermind
  • Mastermind
  • Avatar de Usuario
  • Registrado: Feb 17, 2005
  • Mensajes: 1585
  • Status: Offline

Nota Agosto 1st, 2010, 1:38 pm

lol, creo que Im que va a seguir con expresiones regulares y CType si necesito o alguna otra cosa, el hombre gracias. jaja
There's no place like 127.0.0.1, badass part is now it's ::1
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13458
  • Loc: Florida
  • Status: Offline

Nota Agosto 1st, 2010, 1:57 pm

Sí, hice un montón de grep-ción después de ese puesto y llegar a descubrir que no uso la función strcspn en cualquier lugar en cualquiera de mis sitios o secuencias de comandos. Creo que es una de esas cosas que suena como una muy buena idea un día pero nunca llegó a aplicar.

He enviado un informe de error documentación para PHP.net, necesita ser más claro en la descripción de la función que cuando dicen "inicial", significa el inicio del sujeto de prueba, y no la sección inicial de los personajes malos resultados.
Strong with this one, the sudo is.
  • PolishHurricane
  • Mastermind
  • Mastermind
  • Avatar de Usuario
  • Registrado: Feb 17, 2005
  • Mensajes: 1585
  • Status: Offline

Nota Agosto 1st, 2010, 4:44 pm

ah cool
There's no place like 127.0.0.1, badass part is now it's ::1
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13458
  • Loc: Florida
  • Status: Offline

Nota Agosto 12th, 2010, 6:44 pm

Recibió una respuesta a mi informe de fallo para el manual de PHP en strcspn, theres ahora un ejemplo de código en la copia de SVN del manual, el manual en línea debe seguir tarde o temprano. :)

http://svn.php.net/viewvc/?view=revisio ... ion=302077
Strong with this one, the sudo is.
  • PolishHurricane
  • Mastermind
  • Mastermind
  • Avatar de Usuario
  • Registrado: Feb 17, 2005
  • Mensajes: 1585
  • Status: Offline

Nota Agosto 13th, 2010, 8:10 am

lol, agradable.
There's no place like 127.0.0.1, badass part is now it's ::1

Publicar Información

  • Total de mensajes en este tema: 11 mensajes
  • Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 118 invitados
  • No puede abrir nuevos temas en este Foro
  • No puede responder a temas en este Foro
  • No puede editar sus mensajes en este Foro
  • No puede borrar sus mensajes en este Foro
  • No puede enviar adjuntos en este Foro
 
 

© 2011 Unmelted, LLC. Ozzu® es una marca registrada de Unmelted, LLC