Question de sécurité PHP

  • PolishHurricane
  • Mastermind
  • Mastermind
  • Avatar de l’utilisateur
  • Inscription: Fév 17, 2005
  • Messages: 1585
  • Status: Offline

Message Juillet 30th, 2010, 9:35 pm

Im assez sûr que cela est tout à fait bien, mais pour une raison Im paranoïaque pour cela que je n'ai pas habituellement jamais rien jeter non filtré dans une inclusion ou faire quelque chose comme ça, mais personne ne sait de tous les cas où cela n'est pas sûr et peut être exploité de quelque façon?

PHP Code: [ 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. ?>


J'ai l'habitude d'utiliser une instruction switch pour ce genre de choses avec des valeurs pré-remplie, mais sa trop long et je ne le veux pas pour d'autres raisons.
There's no place like 127.0.0.1, badass part is now it's ::1
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Juillet 30th, 2010, 9:35 pm

  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Juillet 30th, 2010, 11:15 pm

Ce n'est pas de vérifier si la variable $ _REQUEST ["page"] existe avant de l'utiliser. Le code pourrait exposer un chemin de fichier via une notification d'erreur en fonction de la valeur de error_reporting.

Est-ce quelque chose comme ça vous font penser différemment?

PHP Code: [ 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 l’utilisateur
  • Inscription: Fév 17, 2005
  • Messages: 1585
  • Status: Offline

Message Juillet 31st, 2010, 1:52 am

Eh bien oui, ce n'est pas de vérifier si la demande existe dans cet exemple, j'ai omis cette ligne, sa théorie assez bien quand même.

Ive jamais vu ça strcspn () la fonction dont je me souvienne, j'ai aussi raté avec elle, il semble juste retour de l'int ou parfois même l'entrée même, peu importe si la chaîne contient ou ne contient pas ces caractères, vous êtes sûr que la fonction est un filtre fiable? Je trouve cela intéressant bien.

appel Nice sur ce is_readable () d'erreur chemin du fichier. J'ai beaucoup de pages, qui peut être bonne, mais la question...Est-is_readable () lent? Im essayant de garder le chargement de la page optimisée.

Merci à Joe lot
There's no place like 127.0.0.1, badass part is now it's ::1
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Juillet 31st, 2010, 2:24 pm

strcspn peut être un peu déroutant. J'ai régulièrement consulter le manuel après avoir quelque temps sans l'utiliser parce que je suis strcspn et strspn mélangé parce qu'ils ne la chose exactement le contraire. Bien que j'ai une idée pour se rappeler qui on est, qui en ce moment et III de cela plus tard.

strcspn regarde essentiellement pour les caractères qui ne sont pas dans ce masque. Du manuel,

Quote:
strcspn int (string $ str1, string $ str2 [, int $ start [, int $ length]])

Retourne la longueur du segment initial de str1 qui ne contient aucun des caractères en str2.


Si vous suivez à la fonction de la source, vous venez à cette où vous pouvez voir comment la fonction fonctionne en interne. Elle marche seulement à travers la chaîne de la recherche de quelque chose, il ne s'attend pas, cherche alors quelque chose qu'il ne s'attendent et renvoie la longueur de ce segment.

etc / standard / string.c: 1571

C Code: [ 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. }


Tout retour strcspn temps un certain nombre autre que zéro, theres mauvais caractères dans l'entrée et nous écraser l'entrée toute mauvaise avec la valeur par défaut. Ceci est juste un simple cours de l'action après avoir constaté des entrées incorrectes, en réalité, vous auriez probablement finir par les fautes de frappe possible, vérifier une table 301, ou quelque chose du genre.

Maintenant, autant que ce truc pour se souvenir de la fonction ne dont j'ai déjà parlé, Ill à emprunter un commentaire du manuel PHP.

Quote:
strcspn () peut aussi être considérée comme analogue à l'expression régulière suivante:
PHP Code: [ 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 je me souviens strcspn et strspn que les classes de caractères à partir d'expressions régulières, il me suffit de rappeler que dans une classe de caractères complémentée il, que le caractère extra "^" et dans le strcspn nom de la fonction il ya aussi un caractère supplémentaire «C».

-

Je ne peux vraiment pas dire grand-chose is_readable, je l'utilise dans l'exemple parce que le ton de la conversation semble être la sécurité et l'erreur-prevension-sage est is_readable moins sujets aux accidents que quelque chose comme file_exists. Je préfère utiliser file_exists. Im assez bien à s'assurer quelque chose se passe au travail avant qu'il ne devienne, à l'aide de valeurs par défaut comme je le fais Im ne vais pas faire une erreur à propos d'un fichier illisible, sauf par un échec catastrauphic, et des theres aucune raison pour que mon autorisations de fichier pour changer plus tard.
Strong with this one, the sudo is.
  • PolishHurricane
  • Mastermind
  • Mastermind
  • Avatar de l’utilisateur
  • Inscription: Fév 17, 2005
  • Messages: 1585
  • Status: Offline

Message Juillet 31st, 2010, 11:24 pm

Damn cette fonction PHP est source de confusion. Je viens de télécharger moi une copie de la source du code PHP mais (si je peux comprendre la moitié de celle-ci). J'ai pensé qu'il valait la peine doit être étant donné que vous garder le montrer à moi dans les discussions. :)

Quoi qu'il en soit, je pense que nous avons un homme problème. Dire que j'ai eu le script suivant...

PHP Code: [ 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 page est "abc", alors le résultat est: 0
Si la page est "DABC", alors le résultat est: 1
Si la page est «abcd», puis le résultat est: 0 (Oui, ZERO, uh oh)

Donc, vous ne pouvez pas vraiment compter sur que pour la sécurité tristement.
There's no place like 127.0.0.1, badass part is now it's ::1
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Août 1st, 2010, 11:40 am

Eh bien maintenant, c'est un problème. J'ose le dire, il semble même comme un bogue dans la fonction.

Qu'en est-il en utilisant strspn en combinaison avec strlen alors?

PHP Code: [ Select ]
if(strlen($str) == strspn($str, 'abc'))
Strong with this one, the sudo is.
  • PolishHurricane
  • Mastermind
  • Mastermind
  • Avatar de l’utilisateur
  • Inscription: Fév 17, 2005
  • Messages: 1585
  • Status: Offline

Message Août 1st, 2010, 1:38 pm

lol, je pense Im allant coller avec regex et ctype si j'ai besoin ou autre chose, l'homme Merci. haha
There's no place like 127.0.0.1, badass part is now it's ::1
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Août 1st, 2010, 1:57 pm

Ouais, j'ai fait beaucoup de grep-ment après ce poste et viennent de découvrir que je ne pas utiliser la fonction strcspn n'importe où sur n'importe lequel de mes sites ou des scripts. Je pense que ses une de ces choses qui sonne comme une très bonne idée un jour, mais je n'ai jamais réussi à mettre en œuvre.

J'ai soumis un rapport de bogue de documentation pour PHP.net, il a besoin pour être plus clair dans la description de la fonction que quand ils disent "initial", cela signifie le début du sujet d'essai, et non la section initiale de mauvais caractères trouvée.
Strong with this one, the sudo is.
  • PolishHurricane
  • Mastermind
  • Mastermind
  • Avatar de l’utilisateur
  • Inscription: Fév 17, 2005
  • Messages: 1585
  • Status: Offline

Message Août 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
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Août 12th, 2010, 6:44 pm

Reçu de réponse à mon rapport de bug pour le manuel PHP sur strcspn, theres maintenant un exemple de code dans la copie SVN du manuel, le manuel en ligne devrait suivre tôt ou tard. :)

http://svn.php.net/viewvc/?view=revisio ... ion=302077
Strong with this one, the sudo is.
  • PolishHurricane
  • Mastermind
  • Mastermind
  • Avatar de l’utilisateur
  • Inscription: Fév 17, 2005
  • Messages: 1585
  • Status: Offline

Message Août 13th, 2010, 8:10 am

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

Afficher de l'information

  • Total des messages de ce sujet: 11 messages
  • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 129 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC