Optimisation et sécurisation de Pluxml

WebstephWebsteph Member
novembre 2022 modifié dans Modifications

Bonjour,

Pour faire simple, j'ai fait quelques recherches sur le forum afin d'optimiser Pluxml.
Et je suis tombé sur ce sujet.
https://forum.pluxml.org/discussion/3892/optimisation-page-en-cache-et-css-js-minifie-concatene-compresse

Du coup, j'ai crée un fichier class.plx.headers.php que j'ai placé dans le dossier "core/lib"
Pour l'appeler j'ai rajouté une ligne dans l'index à la racine de Pluxml

On inclut les librairies nécessaires
include(PLX_CORE.'lib/class.plx.headers.php');

Après je me suis interessé à la sécurité afin d'obtenir la meilleur note possible sur
https://securityheaders.com/

Donc j'y ai rajouté quelques lignes à ajuster celui vos besoins.

<?php
/**
 * Classe plxHeaders responsable de la securité du site
 *
 * @package PLX
 * @author  Websteph
 **/
header_remove("x-powered-by");
header_remove("Pragma");
header("Content-Type: text/html; charset=utf-8");
header("Accept-Encoding: gzip");
header("Strict-Transport-Security: max-age=31536000; includeSubDomains; preload");
header("X-Frame-Options: SAMEORIGIN");
header("X-Content-Type-Options: nosniff");
header("X-XSS-Protection: 1; mode=block");
header("Referrer-Policy: strict-origin-when-cross-origin");
header("Content-Security-Policy: default-src 'none'; manifest-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self' data:; connect-src 'self'; media-src 'none'; object-src 'none'; frame-src 'self'; frame-ancestors 'none'; form-action 'self'; base-uri 'self';");
header("Permissions-Policy: accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()");
$lastModified=filemtime(__FILE__);
$etagFile = md5_file(__FILE__);
$etag = dechex(fileinode(__FILE__));
$etag.= "-".dechex(filesize(__FILE__));
$etag.= "-".dechex(((filemtime(__FILE__).str_repeat("0",6)+0) & (8589934591)));
$ifModifiedSince=(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false);
$etagHeader=(isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false);
$expire_offset = 60 * 60;
header("Expires: ".gmdate("D, d M Y H:i:s", time() + $expire_offset)." GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $lastModified)." GMT");
header("Etag: W/\"$etag\"");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Vary: Negotiate, Accept-Encoding");
if (@strtotime($_SERVER["HTTP_IF_MODIFIED_SINCE"])==$lastModified || $etagHeader == $etagFile)
{
       header("HTTP/1.1 304 Not Modified");
       exit;
}
?>

Alors maintenant je sais pas si j'ai utilisé la meilleur méthode pour parvenir à mes fins, mais ça fonctionne très bien.
Mais pour moi, c'était surtout important d'optimiser et sécuriser mon Pluxml.

Stéphane

Réponses

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    Bonjour,
    Il y a beaucoup de headers qui peuvent se paramétrer au niveau du serveur, soit dans un fichier .htaccess, soit dans la configuration du "virtual host" si on a la main sur la configuration du serveur.

    Ne pas mélanger les headers envoyés par le navigateur et par le serveur :
    Par exemple, header("Accept-Encoding: gzip") est envoyé par le navigateur.

    Pour limiter les échanges entre navigateur et serveur, on peut paramétrer la durée du cache. Pour une feuille de style CSS, on peut mettre 24 heures. Il n'y a que le fichier index.php qui peut varier souvent.

    Pour avoir une idée des échanges entre navigateur et serveur, on peut utiliser le débogueur de Firefox ou de Chrome en cliquant sur l'onglet réseau puis le fichier téléchargé.

    Pour la durée de vie du cache, Apache sait faire :
    https://httpd.apache.org/docs/2.4/fr/mod/mod_cache.html
    NGinx aussi :
    https://wiki.pluxml.org/docs/install/nginx.html

  • WebstephWebsteph Member
    avril 2023 modifié

    J'ai fait une petite mise à jour de mon fichier class.plx.headers.php comme me l'a suggéré Bazooka. et je lui ai rajouté une petite Fonction pour générer un Nonce aléatoire pour mon Script de commentaire. ici

    <?php if(!defined('PLX_ROOT')) exit; 
    /**
     * Classe plxHeaders responsable de la securité du site
     *
     * @package PLX
     * @author  Websteph
     **/
    
    $nonce = hash('sha256', uniqid('', true));
    $GLOBALS['nonce'] = $nonce;
    
    header("Strict-Transport-Security: max-age=31536000; includeSubDomains; preload");
    header("X-Frame-Options: SAMEORIGIN");
    header("X-Content-Type-Options: nosniff");
    header("X-XSS-Protection: 1; mode=block");
    header("Referrer-Policy: strict-origin-when-cross-origin");
    header("Content-Security-Policy: default-src 'none'; manifest-src 'self'; script-src 'self' 'unsafe-inline' 'nonce-".$GLOBALS['nonce']."'; style-src 'self'; img-src 'self'; font-src 'self'; connect-src 'self'; media-src 'none'; object-src 'none'; frame-src 'self'; frame-ancestors 'none'; form-action 'self'; base-uri 'self';");
    header("Permissions-Policy: accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()");
    $etag = md5_file(__FILE__);
    header("Etag: $etag");
    $last_modified_time = filemtime(__FILE__);
    header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");
    if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag ||
        isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $last_modified_time) {
        header('HTTP/1.1 304 Not Modified');
        exit;
    }
    header_remove("x-powered-by");
    ?>
    

    Je précise que celui ci est prévu pour un site en HTTPS mais vous pouvez commenter la ligne Strict-Transport-Security, si c'est pas votre cas.

Connectez-vous ou Inscrivez-vous pour répondre.