Bonjour à tous et à toutes,

J'avais commencé un projet au top de sa forme, mais stagiaire, mon tuteur m'a finalement dit de l'arrêter et de recommencer pour obtenir quelque chose de fonctionnel plus rapidement avec un code plus allégé... Le projet était de construire un plugin Wordpress, qui s'insère dans un widget, dans le tableau de bord, et qui consiste à protéger les dossiers et fichiers contenu dans le dossier du site par des click sur les boutons, car pour ceux qui ne le savent pas, Wordpress est un CMS open source, et les failles de sécurité ne sont pas moindres.

Après être passé d'une interface dynamique, dont le code venait entièrement de moi en plus, donc je savais où j'allais, à une interface, qui plus simple est par rapport à la première, dans laquelle je me perds un peu, je me retrouve donc confronté à un problème : le CHMOD !

J'aimerais, après avoir sélectionner des checkboxs, et après avoir appuyer sur un bouton (qui comprend une valeur), appliquer un CHMOD, qui comprend la valeur du bouton sélectionné (soit 0777 par exemple), et cette dernière serait affectée aux dossiers sélectionnés.

Voici mon code :

index.php

<style>
    <?php
        include 'css/dashboardFormulaire.css';
    ?>
</style>
<script>
function chercher_elements(n) {
    var liste = document.getElementsByTagName('input'),
        nbre = liste.length,
        cherche=n+'-',
        lg=cherche.length,
        trouve = [],
        index,
        element,
        zz;
    for (index = 0; index < nbre; index ++) {
        element = liste[index].id;
        if (n!='tout') {
          if (element.substring(0,lg)==cherche) trouve.push(element);
        } else {
          if (element.substring(0,1)>='0' && element.substring(0,1)<='9') trouve.push(element);
        }
    }
    return trouve;
}

function selectionner(z,chk){
  var dossiers = chercher_elements(z);
  var nbre = dossiers.length;
  for (var i = 0; i < nbre; i++) {
    document.getElementById(dossiers[i]).checked=chk;
  }
}
</script>
<?php
function scanRecursiveDir($path = '../', $level , $levelprec)
{
    if(substr_count($levelprec, '-') != 0) return;
    $numdossier = 1;
    // Répertoires à ignorer
    $ignore = array('.', '..','public_html');
    // Répertoire à ouvrir
    $dh = @opendir($path);
    // Boucler dans le répertoire :
    while(false !== ($file = readdir($dh)))
    {
        //Si ce fichier ne doit pas être ignoré alors...
        if(!in_array( $file, $ignore))
        {
            // On effectue un espace pour une meilleure vue...
            $spaces = str_repeat('&nbsp;', ($level * 5));

            // Et on ne montre que les sous-répertoires !
            if(is_dir("$path/$file"))
            {

                //On place dans une variable les droits de chaque répertoires que l'on appelera à chaque fois
                $perms = substr(sprintf('%o', fileperms($path)), -3);
                // On appelle à nouveau cette fonction dans les nouveaux répertoires de façon à ce que ce soit récursif.
                $idcourant = "$levelprec".(strlen($levelprec)?'-' : '')."$numdossier";
                echo"
                <li id=\"lucie_arborescence\">"
                .$spaces."\r\n".
                "<input type=\"checkbox\" name=\"checkboxDossierPath[]\" id=\"$idcourant\" onclick = \"selectionner('$idcourant',this.checked);\" value=\"$path\"/>
                \r\n"."<a href=$path/$file> $file</a>
                <div class=\"securitywp_droit\">($perms)</div></li>";
                scanRecursiveDir("$path/$file", ($level+1),"$levelprec".(strlen($levelprec)?'-' : '')."$numdossier");
                $numdossier++;
            }
        }
    }
//On n'oublie pas de fermer le répertoire racine
closedir($dh);
}
?>
<div id="securitywp_explorateur">
    <header id="securitywp_header">
        <input type="checkbox" name="toutCocher" id="checkall" onclick = "selectionner('tout',this.checked);" />
        Tout sélectionner
    </header>
    <div id="securitywp_container_id">
        <div id="securitywp_result_ajax"></div>
        <?php
            echo '<form id="securitywp_form" name="form" action="../wp-content/plugins/SecurityWP/traitement.php" methode="POST"><ul>';
                scanRecursiveDir('../', 0, '');
        ?>
            <div id="securitywp_chmodButtons">
                Choisir une sécurité : 
                <br/>
                <input type="button" name="button01" id="button001" class="class_buttons" value="0600" onclick="this.form.choice.value=this.value;"/>
                <input type="button" name="button02" id="button002" class="class_buttons" value="0755" onclick="this.form.choice.value=this.value;"/>
                <input type="button" name="button03" id="button003" class="class_buttons" value="0705" onclick="this.form.choice.value=this.value;"/>
            </div>
            <div id="securitywp_footer">
                Retirer la sécurité : 
                <br/>
                <input type="button" name="button04" id="securitywp_noSecurity" class="class_buttons" value="0777" name="securitywp_noSecurity" onclick="this.form.choice.value=this.value;"/>
                <input type="hidden" name="choice" id="choice"/>
            </div>
        <?php
            echo '</ul></form>';
        ?>
    </div>
</div>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
$(document).ready(function()
{
    $("#securitywp_form").submit(function(e)
    {
        var postData = $(this).serializeArray();
        var formURL = $(this).attr("action");
        $.ajax(
        {
        url : formURL,
        type: "POST",
        data : postData,
        success:function(data, textStatus, jqXHR) 
        {
            function include(file) 
            {
                var oScript =  document.createElement("script");
                oScript.src = file;
                document.body.appendChild(oScript);
                $("#securitywp_result_ajax").html(data);
                $("#securitywp_result_ajax").css({"display":"block"});
            }
            include("../wp-content/plugins/SecurityWP/traitement.php");
        },
        error: function(jqXHR, textStatus, errorThrown) 
        {
            $("#securitywp_result_ajax").html("Attention");      
        }
        });
        e.preventDefault(); //STOP default action
    });

    $("#securitywp_noSecurity").click(function()
    {
        $("#securitywp_form").submit();
    });
    $("#button001").click(function()
    {
        $("#securitywp_form").submit();
    });
    $("#button002").click(function()
    {
        $("#securitywp_form").submit();
    });
    $("#button003").click(function()
    {
        $("#securitywp_form").submit();
    });
});
</script>

Et voici traitement.php :

<?php   
if(isset($_POST['checkboxDossierPath'])) 
{
    $valeurNumerique = $_POST['choice'];
    echo $valeurNumerique;
    foreach($_POST['checkboxDossierPath'] as $valeur)
    {               
        echo "La checkbox $valeur a été cochée<br>";
        chmod($valeur, $valeurNumerique);
    }
}
else
{
    echo 'Veuillez tout d\'abord sélectionner les dossiers auxquels modifier les attributs.';
}
?>

Et voici l'erreur :

No such file or directory in C:\wamp\www\wordpress2\wp-content\plugins\SecurityWP\traitement.php on line 9;

Toutefois, je tiens à signaler que j'ai une petite appréhension au niveau du code. Je pense que $variable contient le chemin des fichiers, dossiers et non pas le nom de ces derniers.
Alors comment faire, s'il vous plaît ?

6 réponses


Bonsoir,

Je pense que ton chemin suivant : ./wp-content/plugins/SecurityWP/traitement.php

N'est pas correct, essaye de regarder à ce niveau

Et bien j'ai beau mettre un chemin absolu, rien ne change...
En plus je viens d'appliquer un var_dump($valeur) et il s'agit bien d'un chemin qui est renvoyé puisque pour wp-admin par exemple j'obtiens string '../wp-admin' (length=11).

Tu es sur que le chemin est le bon ? Parce que l'erreur indique qu'il ne trouve pas traitement.php dans /wp-content/plugins/SecurityWP/

si je ne dis pas de trop de conneries, chmod() ne fonctionne pas sur des fichiers sous windows , c'est dédié à du Unix, dans le cadre d'un FTP, etc ... après c'est tout de même bizarre d'obtenir cette erreur, la fonction devrait passer, mais sans effet sous windows : es-tu sûr du chemin de ton fichier ?

Si l'utilisateur httpd (www-data ou autre) peut modifier les droits, en cas de piratage, je vous laisse imaginer
Le pirate peut modifier les droits, créer et modifier des fichiers
le b-a-ba c'est de ne pas mettre l'utilisateur www-data en propriétaire
on peut mettre comme propriétaire root et comme groupe www-data
on adapte les droits d'écritures seulement pour les répertoires qui en ont besoin
donc un plugin qui modifie les droits ... ça craint !!!

Peut-être, mais je suis en stage et on m'a demandé de produire ceci. :/