[spip-dev] Mots de passe sur le site public / Output Buffering / bug affichage images

Salut à tous,

ATTENTION 3 BIDOUILLAGES.

* si vous voulez sécuriser un peu votre site public, vous pouvez par exemple
restreindre l'accès aux *articles* mais pas aux rubriques en ajoutant en
tête du fichier d'appel article.php3 les quelques lignes suivantes :

<?
    include "ecrire/inc_connect.php3";
    include "ecrire/inc_auth.php3";

    $fond = "article";
    ...
?>

Pour sécuriser ainsi tous les fichiers spip, il suffit de modifier tous les
fichiers d'appel. Ca merdouille un peu car en cas de refus d'accès la page
d'erreur correspond à la page d'erreur de spip/ecrire/ ; de plus ça
ralentit pas mal le site puisqu'il y a un inc_connect.php3 sur chaque accès.

Il n'est pas très difficile de modifier spip pour supprimer ces deux
problèmes (ajouter include inc_connect dans inc_auth uniquement au moment
opportun, et améliorer le message d'erreur en cas d'accès refusé)... je le
fais dans la version 1.3beta1/

Du coup pour sécuriser un ensemble d'articles on ajoute juste

    $auth_text = '<a href="./">retour au sommaire</a>'; // ou ce qu'on veut
    include "ecrire/inc_auth.php3";

dans le fichier d'appel...

Ah oui : cela permet de restreindre l'accès aux seuls rédacteurs (et admins)
présents dans la base spip, évidemment !

Antoine : dans inc_auth, ne sachant pas si je suis appelé depuis
spip/ecrire/ ou depuis spip/, j'ai mis
    @include "inc_connect.php3";
    @include "ecrire/inc_connect.php3";

mais je pense qu'il existe une méthode plus correcte ?

* autre modif expérimentale dans la 1.3, celle proposée par Nicolas Hoizey et
qui consiste à vérifier qu'on n'a pas déjà ouvert un buffer ob_...
(modif dans inc_version.php3)

(référence :
    Message-ID: <1003223201.3bcbf8a196a01@imp.free.fr>
)

* il faut régler la question des images d'articles qu'on modifie : lorsqu'on
poste une image, comment indiquer au navigateur qu'il faut la recharger et
pas afficher l'ancienne version ? Un javascript serait capable de le faire ?

@ Stéphane (Stephane@Netinfo.fr) :

Par contre où ça se complique c'est que je n'arrive plus à accéder au rep
"ecrire" si je place un mot de passe pour l'accès au site.
Je m'explique : j'ai :
http://monsite.free.fr/Repertoire_acces_reservé/Spip/ecrire

Dans Repertoire_acces_reservé j'ai placé un fichier .htaccess limitant la
visite des pages aux seules personnes autorisées. Ca marche très bien mais
là où ça se corse c'est quand je demande l'accés à admin, le serveur me
refuse l'accés. Comment contourner le problème ?

-- Fil

Salut,

fais dans la version 1.3beta1/

On en est à la 1.2.1. Je n'ai pas envie d'attendre la sortie de la 1.3
si je fais d'éventuelles modifs, donc éviter d'incrémenter la "grosse version"
à chaque fois qu'on rajoute un truc. Renommer en 1.2.1 ;))

* si vous voulez sécuriser un peu votre site public, vous pouvez par
exemple
restreindre l'accès aux *articles* mais pas aux rubriques en ajoutant
en
tête du fichier d'appel article.php3 les quelques lignes suivantes :

<?
    include "ecrire/inc_connect.php3";
    include "ecrire/inc_auth.php3";

Non, inc_auth n'est pas prévu pour ça. Ca ne marchera pas en mode .htaccess.
Ca ne marchera peut-être pas dans une future version avec authentification
par sessions ou cookies. Si on veut faire de la gestion d'accès sur le site
public, on le fera proprement. Il faut enlever toutes ces modifs.

    @include "ecrire/inc_connect.php3";

mais je pense qu'il existe une méthode plus correcte ?

Il y a un problème avec PHP3 (vieilles versions peut-être) : @include(...)
ne marche pas (erreur PHP) car include n'est pas considéré comme une fonction.
Il faudra adopter un système de $dir_spip et $dir_spip_ecrire comme dans
d'autres softs, ce qui permettra à ceux qui veulent mettre leur SPIP dans un
répertoire séparé de le faire.

* autre modif expérimentale dans la 1.3, celle proposée par Nicolas
Hoizey et
qui consiste à vérifier qu'on n'a pas déjà ouvert un buffer ob_...
(modif dans inc_version.php3)

La doc dit qu'on peut imbriquer les output buffers, donc je pense
qu'il faudrait évaluer l'intérêt de la modif, qui est peut-être superflue.

a+

Antoine.

Bonsoir,

fais dans la version 1.3beta1/

On en est à la 1.2.1. Je n'ai pas envie d'attendre la sortie de la
1.3 si je fais d'éventuelles modifs, donc éviter d'incrémenter la
"grosse version" à chaque fois qu'on rajoute un truc. Renommer en
1.2.1 ;))

Pour ne pas dérouter les utilisateurs, il faudrait respecter des
règles généralement admises dans la gestion de numéros de versions.

Adoptons par exemple le modèle qui est en cours de validation pour PHP
et Zend :

http://marc.theaimsgroup.com/?l=php-dev&m=100129854421724&q=raw

@include "ecrire/inc_connect.php3";

Il y a un problème avec PHP3 (vieilles versions peut-être) :
@include(...) ne marche pas (erreur PHP) car include n'est pas
considéré comme une fonction.

Le plus gros problème que je vois pour ma part, c'est qu'on met des
'@' un peu partout pour masquer les warnings, ce qui empêche de bien
débugguer, et permet surtout de mal développer en ne traitant pas
"manuellement" les cas particuliers.

C'est sympa sur le moment car ça permet de coder vite fait de
nouvelles fonctionnalités, mais c'est un mauvais investissement pour
l'avenir.

Il suffit de rajouter au tout début de article.php3 la ligne suivante
et de voir le résultat :

error_reporting(E_ALL);

Cela ne fait aucune différence avec une appli bien développée, regardez
ce que ça fait avec SPIP ...

* autre modif expérimentale dans la 1.3, celle proposée par Nicolas
Hoizey et qui consiste à vérifier qu'on n'a pas déjà ouvert un
buffer ob_... (modif dans inc_version.php3)

La doc dit qu'on peut imbriquer les output buffers, donc je pense
qu'il faudrait évaluer l'intérêt de la modif, qui est peut-être
superflue.

On peut en effet imbriquer les output buffers, mais ce n'est pas
applicable ici à cause du handler particulier utilisé : ob_gzhandler

S'il y a un output buffer "ouvert" avant celui de SPIP, la gestion de
compression du flux ne peut pas fonctionner, donc il faut en récupérer
le contenu puis le réinjecter dans le nouveau.

Je rapelle les dernières lignes de inc_version.php3 :

if ($ob_exists) {
        // special bug de NetCache (probleme NOOS)
        $use_gz = true;
        if (eregi("NetCache", $HTTP_SERVER_VARS['HTTP_VIA'])) {
                $use_gz = false;
        }
        if ($use_gz) {
                $alreadySent = ob_get_contents();
                if ($alreadySent == false) $alreadySent = '';
                ob_end_clean();
                ob_start("ob_gzhandler");
                echo $alreadySent;
        }
        header("Vary: Accept-Encoding");
}

-Nicolas