Annonce

Écrire une réponse

Veuillez écrire votre message et l'envoyer

Cliquez dans la zone sombre de l'image pour envoyer votre message.

Retour

Résumé de la discussion (messages les plus récents en premier)


Notice: Undefined offset: 5 in /var/www/fr.piwigo.org/forum/include/parser.php on line 551
Nicolas Busser
2016-07-08 11:20:20

plg a écrit:

Bon alors, j'ai pas trop envie de toucher à random_compat (la lib que j'ai sélectionné pour générer de l'aléatoire) parce qu'il y a plus ou moins une raison pour chaque test/condition...

Ce que j'ai codé, c'est un fallback sur une autre lib, normalement moins contraignante (mais également moins "aléatoire").

Pour tester, il faut télécharger srand.php sur [Github] Secure-random-bytes-in-PHP file srand.php (clic droit "save as" sur le bouton "raw" en haut à droite). Copier le fichier srand.php dans le répertoire "include" de Piwigo.

Puis dans le fichier include/functions_session.inc.php, remplacer la fonction generate_key (ligne 63), par :

Code:

function generate_key($size)
{
  include_once(PHPWG_ROOT_PATH.'include/random_compat/random.php');

  try
  {
    $bytes = random_bytes($size+10);
  }
  catch (Exception $ex)
  {
    include_once(PHPWG_ROOT_PATH.'include/srand.php');
    $bytes = secure_random_bytes($size+10);
  }

  return substr(
    str_replace(
      array('+', '/'),
      '',
      base64_encode($bytes)
      ),
    0,
    $size
    );
}

Merci pour cet patch ! Sur le sites hébergés par le Centre de Calcul du CNRS/IN2P3 j'avais le même souci et ton patch fonctionne !

hpsam
2016-05-09 19:47:30

srand fonctionne pour moi.
J'ai bien la page notification.php sans Fatal et en invité le hash du flux RSS est bien rafraichi.

hpsam
2016-05-09 19:38:28

@plg : Ton message est passé pendant que je réfléchissait et pondait ma réponse.
Je vais tester srand, qui passe dans l'ordre inverse : openssl, mcrypt, /dev/urandom

hpsam
2016-05-09 19:31:38

Attention : j'ai par erreur mis /dev/random dans mes messages précédent, mais c'est /dev/urandom

De ce que je viens de lire (mais tous ne sont pas d'accord) et qui confirme mon avis, open_basedir ne s'applique pas forcément à toutes les commandes PHP. Il bride ce que peu faire un script PHP par rapport aux paramètres passés dans le script à certaines commandes (fopen, fwrite...). Mais ce n'est pas parce que fopen est bridé que les fonctions de PHP et ses extensions le sont.
open_basedir n'affecte pas le code C de PHP et ses extentions. Si dans mcrypt il est codé une lecture en dure de /dev/urandom, seul les droits Linux attribués à l'utilisateur (et ses groupes) du processus PHP entreront en jeux.

Si /dev/urandom tout en étant dans l'open_basedir n'est pas lisible, mcrypt aura de grande chance d'être bloqué, mais l'absence dans l'open_basedir ne bloque pas forcément mcrypt.

Cela à donc un sens de faire appel à mcrypt quand l'open_basedir ne permet pas un accès direct à /dev/urandom.

En fait le test pour mcrypt devrait être :

Code:

        if (
            !function_exists('random_bytes')
            &&
            PHP_VERSION_ID >= 50307
            &&
            extension_loaded('mcrypt')
            &&
            (DIRECTORY_SEPARATOR !== '/' || ! $RandomCompatUrandomFailed)
        ) {

$RandomCompatUrandomFailed ne devant être vrai que si open_basedir contient /dev, /dev/ ou /dev/urandom et que /dev/urandom n'est pas lisible.

Idée plus complète de correction :

Code:

        /**
         * Reading directly from /dev/urandom:
         */
        if (DIRECTORY_SEPARATOR === '/') {
            // DIRECTORY_SEPARATOR === '/' on Unix-like OSes -- this is a fast
            // way to exclude Windows.
            $RandomCompatUrandom = true;
// ADD 1 LINE ---------------------------------------------------------------------
      $RandomCompatUrandomFailed = false;
            $RandomCompat_basedir = ini_get('open_basedir');

            if (!empty($RandomCompat_basedir)) {
                $RandomCompat_open_basedir = explode(
                    PATH_SEPARATOR,
                    strtolower($RandomCompat_basedir)
                );
                $RandomCompatUrandom = (array() !== array_intersect(
                    array('/dev', '/dev/', '/dev/urandom'),
                    $RandomCompat_open_basedir
                ));
                $RandomCompat_open_basedir = null;
            }

      
      
            if (
                !function_exists('random_bytes')
                &&
                $RandomCompatUrandom
        &&
// REMOVE 1 LINE, ADD 1 LINE ---------------------------------------------------------------------
//                @is_readable('/dev/urandom')
        ($RandomCompatUrandomFailed = @is_readable('/dev/urandom')
            ) {
                // Error suppression on is_readable() in case of an open_basedir
                // or safe_mode failure. All we care about is whether or not we
                // can read it at this point. If the PHP environment is going to
                // panic over trying to see if the file can be read in the first
                // place, that is not helpful to us here.

                // See random_bytes_dev_urandom.php
                require_once $RandomCompatDIR.'/random_bytes_dev_urandom.php';
            }
            // Unset variables after use
            $RandomCompat_basedir = null;
        } else {
            $RandomCompatUrandom = false;
// ADD 1 LINE ---------------------------------------------------------------------
      $RandomCompatUrandomFailed = false;
        }

        /**
         * mcrypt_create_iv()
         */
        if (
            !function_exists('random_bytes')
            &&
            PHP_VERSION_ID >= 50307
            &&
            extension_loaded('mcrypt')
            &&
// REMOVE 1 LINE, ADD 1 LINE ---------------------------------------------------------------------
//            (DIRECTORY_SEPARATOR !== '/' || $RandomCompatUrandom)
            (DIRECTORY_SEPARATOR !== '/' || ! $RandomCompatUrandomFailed)
        ) {
            // Prevent this code from hanging indefinitely on non-Windows;
            // see https://bugs.php.net/bug.php?id=69833
            if (
                DIRECTORY_SEPARATOR !== '/' || 
                (PHP_VERSION_ID <= 50609 || PHP_VERSION_ID >= 50613)
            ) {
                // See random_bytes_mcrypt.php
                require_once $RandomCompatDIR.'/random_bytes_mcrypt.php';
            }
        }
        $RandomCompatUrandom = null;
// ADD 1 LINE ---------------------------------------------------------------------
    $RandomCompatUrandomFailed = null;

Notice: Undefined offset: 5 in /var/www/fr.piwigo.org/forum/include/parser.php on line 551
plg
2016-05-09 19:11:57

Bon alors, j'ai pas trop envie de toucher à random_compat (la lib que j'ai sélectionné pour générer de l'aléatoire) parce qu'il y a plus ou moins une raison pour chaque test/condition...

Ce que j'ai codé, c'est un fallback sur une autre lib, normalement moins contraignante (mais également moins "aléatoire").

Pour tester, il faut télécharger srand.php sur [Github] Secure-random-bytes-in-PHP file srand.php (clic droit "save as" sur le bouton "raw" en haut à droite). Copier le fichier srand.php dans le répertoire "include" de Piwigo.

Puis dans le fichier include/functions_session.inc.php, remplacer la fonction generate_key (ligne 63), par :

Code:

function generate_key($size)
{
  include_once(PHPWG_ROOT_PATH.'include/random_compat/random.php');

  try
  {
    $bytes = random_bytes($size+10);
  }
  catch (Exception $ex)
  {
    include_once(PHPWG_ROOT_PATH.'include/srand.php');
    $bytes = secure_random_bytes($size+10);
  }

  return substr(
    str_replace(
      array('+', '/'),
      '',
      base64_encode($bytes)
      ),
    0,
    $size
    );
}
plg
2016-05-09 18:15:59

A noter qu'entre la théorie et la pratique il y a des écarts importants parfois...

par exemple, je me suis mis dans une configuration proche de celle d'hpsam, donc avec un open_basedir sans /dev, donc pas possible de lire directement /dev/urandom. Ensuite j'ai viré le test comme suggéré par hpsam, et ça marche très bien...

plg
2016-05-09 18:14:10

J'apporte des infos mais pas une solution.

hpsam, le test que tu as commenté, il a été ajouté parce qu'apparemment si /dev/urandom n'est pas lisible, cela implique que mcrypt ne pourra pas non plus travailler car il se base dessus également.

Pour moi ça signifie donc que l'utilisation de mcrypt n'a aucun intérêt : on essaie d'utiliser mcrypt que si urandom ne marche pas, sauf que mcrypt a besoin que urandom marche. Le serpent se mord la queue...

Du coup, les utilisateurs ayant un open_basedir, sans /dev dedans, ils sont bien bloqués en théorie. Sauf flop25 qui défie les lois du code :-/

Je cherche...

flop25
2016-05-08 20:42:38

ma config de manière plus complète

- Linux Debian Jessie
- L'extension libsodium n'est pas installé
- open_basedir non vide et ne contenant pas /dev, /dev/ ou /dev/random pour tous les sites D'ailleurs owncloud me le rabâche à chaque fois
- PHP 5.6.19-0+deb8u1
-  Mcrypt 2.5.8 activé,
- L'extension com_dotnet n'est pas installé

hpsam
2016-05-08 19:10:47

Mais ton open_basedir contient-il quelque chose ?

J'ai compléter un peu plus loin en réponse à Laurent77

- Linux
- PHP supérieur à 5.3.7 et non compris entre 5.6.9 et 5.6.13
- open_basedir non vide et ne contenant pas /dev, /dev/ ou /dev/random

Je vais éditer le message pour grouper les infos.

flop25
2016-05-08 14:10:13

hpsam a écrit:

J'ai jeté un coup d'oeil au fichier include/random_compat/random.php :

- L'extension libsodium n'est installé pour aucun des sites,
- /dev/urandom n'est dans l'open_basedir d'aucun des sites,
- Tous les sites ont la même conf PHP avec Mcrypt 2.5.8 activé,
- L'extension com_dotnet n'est installé pour aucun des sites.

je suis dans la même configuration mais pas de fatal error pour moi

Laurent77
2016-05-07 21:33:10

Merci hpsam !

J'ai commenté les 2 lignes et ça a fonctionné nickel, j'ai pu envoyer mes notifs !

Merci pour ton aide

A+

hpsam
2016-05-07 21:09:24

Alors tu es dans le même cas que moi :
- Linux
- PHP supérieur à 5.3.7 et non compris entre 5.6.9 et 5.6.13
- open_basedir non vide et ne contenant pas /dev, /dev/ ou /dev/random
- mcrypt activé

Le script générant les nombres aléatoires, dans ce cas, saute le test de mcrypt (alors qu'il est présent) et ne trouve pas de solution pour générer le hash aléatoire pour les notifications.

J'ai filé les infos en échange direct à Pierrick @plg. J'ai une solution pour notre cas, mais je laisse le soin à la team PiWiGo de trouver une solution générique.

Solution qui a fonctionné pour moi, avec les prérequis en début de message, mais SANS AUCUNE GARANTIE pour les autres :
Dans le fichier include/random_compat/random.php commenter le test sur DIRECTORY_SEPARATOR et $RandomCompatUrandom :

Code:

if (
            !function_exists('random_bytes')
            &&
            PHP_VERSION_ID >= 50307
            &&
            extension_loaded('mcrypt')
            &&
            (DIRECTORY_SEPARATOR !== '/' || $RandomCompatUrandom)
        ) {

devient (ajout de # sur 2 lignes) :

Code:

if (
            !function_exists('random_bytes')
            &&
            PHP_VERSION_ID >= 50307
            &&
            extension_loaded('mcrypt')
#            &&
#            (DIRECTORY_SEPARATOR !== '/' || $RandomCompatUrandom)
        ) {

Une autre solution non testée, si tu as la main sur la configuration de l'open_basedir, est d'y ajouter /dev/random

@+

Laurent77
2016-05-07 16:38:48

Slt

Merci pour ta réponse .

Alors pour openbasedir j'ai ça :

open_basedir    /volume1/web/piwigo:/etc.defaults:/etc:/usr/syno/synoman:/var/services/tmp:/var/services/web:/var/services/homes:/volume1/photo


et pour mcrypt j'ai ça

Registered Stream Filters    zlib.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk, bzip2.*, convert.iconv.*, mcrypt.*, mdecrypt.*

Par contre, je n'y suis pour rien ;-)

merci pour ton aide !

A+

hpsam
2016-05-07 15:36:06

Slt,

Utilises-tu une configuration d'open_basedir pour ton site ?
As-tu l'extension PHP "mcrypt" d'installée ?

Tu peux trouver ces informations via le lien "Montrer les informations / Show info" sur la page d'accueil de l'administration de ta galerie. Dans les informations sur l'Environnement.

Cherches open_basedir et mcrypt dans ces informations.

@+

Laurent77
2016-05-07 13:20:58

Bonjour

Même problème pour moi depuis la mise à jour 2.8 vers 2.8.1. Les notifications ne fonctionnent plus :

Fatal error: Uncaught exception 'Exception' with message 'There is no suitable CSPRNG installed on your system' in /volume1/web/piwigo/include/random_compat/random.php:185 Stack trace: #0 /volume1/web/piwigo/include/functions_session.inc.php(71): random_bytes(40) #1 /volume1/web/piwigo/include/functions_user.inc.php(1567): generate_key(30) #2 /volume1/web/piwigo/admin/notification_by_mail.php(295): create_user_auth_key('23', 'normal') #3 /volume1/web/piwigo/admin/notification_by_mail.php(568): do_action_send_mail_notification('send', Array, '') #4 /volume1/web/piwigo/admin.php(301): include('/volume1/web/pi...') #5 {main} thrown in /volume1/web/piwigo/include/random_compat/random.php on line 185

Installation :
Nas Synology  DSM 6.0-7321 Update 6
PHP: 5.6.20 (Show info) [2016-05-07 13:19:46]
MySQL: 5.5.47-MariaDB [2016-05-07 13:19:46]
Graphics Library: GD bundled (2.1.0 compatible)

Laurent

Pied de page des forums

Propulsé par FluxBB

github twitter newsletter Faire un don Piwigo.org © 2002-2024 · Contact