Bonjour,
j'ai vécu ce soir la désagréable surprise de voir qu'un fichier. txt de mon site web venait d'être corrompu par "autrui" à l'affichage.

Or ce fichier par .php et requête ajax définit un affichage : lequel a été modifié ... sans que je n'eus attribué aucun droit droit d'accès autre que le mien.

Auriez-vous quelque idée de la défaillance qui fut la mienne, et par quelle voie y remédier ?
Modérateur
Bonjour,

Au niveau des défaillances possibles ayant permis à un malveillant de modifier ce fichier (si c'est bien le cas, car ce n'est pas si facile que ça), la liste est longue et dépend complètement du contexte. Sans information plus précise, on peut juste dire que le problème peut venir d'à peu près n'importe où.

Désolé de ne pas pouvoir faire plus que ça pour l'instant.

Amicalement,
Modérateur
Bonjour,

Déjà les questions générales :

Tu l'as fait avec quoi, le site ? Du code "à la main" ? Avec un cms ? Si oui lequel ?
Y-a-t-il une base de données ?
Y-a-t-il des utilisateurs avec des identifiants/mot de passe qui s'y connectent ?
Y-a-t-il des administrateurs ?
Les éventuels mots de passe sont-ils bien cryptés dans l'éventuelle base de données ?
Y-a-t-il des discussions en ligne entre les différents utilisateurs ?
Y-a-t-il des articles avec la possibilité d'y déposer des avis ou des commentaires ?
Y-a-t-il des formulaires ? Si oui, les données qu'ils envoient sont-elles "vérifiées" sur le serveur par un moyen quelconque ?
Y-a-t-il des uploads de fichiers possibles sur le serveur (des images, des documents, etc.) ?
Par qui ou quelle sorte d'organisation est géré le serveur ?
Est-il mutualisé ?
Y-a-t-il une politique de sécurité pour les fichiers sur le serveur ? Les droits d'accès à ces fichiers (en particulier en écriture) sont-ils appropriés ?
Y-a-t-il du versioning, ou bien y-envoie-t-on les fichiers contenant le code via ftp ?
Le fichier txt qui pose problème est-il visible dans un navigateur si on y met simplement son url ?
Tous les ressources (le code, le fichier txt, l'éventuelle base de données, etc.) sont-elles sur un même serveur ou sur plusieurs ?
Quelles logs sont consultables sur le serveur ?
Le site est-il en https ?
On parle d'ajax. La méthode d'envoie des paramètres est-elle GET ou un POST ?
Y-a-t-il des configurations CORS particulières ?

etc.

Vraiment, le sujet est vaste. On n'a même pas abordé les cas particuliers . Si on devait tout écrire a priori sans avoir aucun détail, il faudrait sans doute des centaines de bouquins pour lister tout ce qu'il y a à lister.

Et même en sachant tout ça, on n'est pas sûr de pouvoir savoir comment aura fait l'attaquant !

Amicalement,
Bonsoir Jencal, et merci de tant de sollicitude.

Pour répondre à tes cent questions, j'envisage ceci prioritairement :
1/ du code "à la main" (j'adore) ;
2/ get
3/ ... pour m'amuser tandis que tout fonctionnait bien, dans la barre de mon nav en ligne j'ai rentré le path du fichier .txt (qui enregistre puis restitue un nombre incrémenté de chaque manœuvre interactive des visiteurs, lequel nombre est visible en ligne sur la page-mère) : le chiffre réel s'affiche, puis dans les secondes qui suivent, en actualisant ma page-mère par F5, le compteur global chute de 500 mille à 2 mille ; faut-il en conclure une faille du navigateur (Firefox) ?

...
Jencal,
en guise d'info et de piste de compréhension du problème, la matrice suivante serait peut-être à étudier par ce jeu d'échanges (au demeurant : fort aidant, instructif, réjouissant) :
https://forum.alsacreations.com/topic-1-88943-1-Compteur-de-like-a-nombre-variable.html

Puis, ceci qui est opérationnel en ligne :

1/ .html et .js dans la page-mère :

<p id="counterview">
        <?php foreach ($data as $i => $v): ?>
        <?php 
            $query_string = http_build_query([
                'more' => $v,
                'sec' => md5($salt.dirname($_SERVER['PHP_SELF']).'/'.$path_controller.'more'.$v)
            ]);

        ?>
<a class="like" href="<?= $path_controller ?>?<?= $query_string ?>">+<?= $v ?> <i style="font-size:.3em;font-family:verdana">like</i></a>
        <?php endforeach; ?>
</p>

<p id="content-result">
<a id="result"><?= file_exists($counter_file)? file_get_contents($counter_file) : '0' ?></a><br><i id="glob">global like depuis le 03 novembre 2021</i>
</p>


window.addEventListener('DOMContentLoaded', () =>{
    document.querySelectorAll('#counterview a').forEach(($a, i) =>{
        $a.addEventListener('click', e=>{
            e.preventDefault();
            let xhr = new XMLHttpRequest();
            xhr.open("GET", $a.href, true);
            xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
            xhr.addEventListener('readystatechange', ev =>{
                if(xhr.readyState == 4 && xhr.status == 200) {
                    if(/^\d+$/.test(xhr.responseText)){
                    document.getElementById('result').textContent = xhr.responseText;
	let $vids = document.getElementById('vids');
	$vids.pause();
	$vids.src = `vid/c${i + 1}.mp4`;
	$vids.poster = `img/c${i + 1}.png`;
	$vids.play();

	let nombre = res.innerHTML;
	var nb = new Intl.NumberFormat().format(nombre);
	res.innerHTML = nb;
                    }
                }
            });
            xhr.send();
        });
    });
});

var res = document.getElementById('result');
let nombre = res.innerHTML;
var nb = new Intl.NumberFormat().format(nombre);
res.innerHTML = nb;


2/ .php extérieur appelé en annexe :

<?php

    if(!empty($_GET['more']) && !empty($_GET['sec'])){
        $salt = "counterlike";        
        $confirm = md5($salt.dirname($_SERVER['PHP_SELF']).'/'.basename($_SERVER['PHP_SELF']).'more'.$_GET['more']);

        if($confirm === $_GET['sec']){
            $more = intval($_GET['more']);
            $source = 'counter.txt';
            if(!file_exists($source)){
                touch($source);
                chmod($source, 0666);
                file_put_contents($source, 0);
            }

            $count = intval(file_get_contents($source));
            $result = intval($_GET['more']) + $count;
            file_put_contents($source, $result);
            if("XMLHttpRequest" === $_SERVER['HTTP_X_REQUESTED_WITH']){
                echo $result; die;
            }
        
        header('location:'.$_SERVER['HTTP_REFERER']);        
    }
?>

Modifié par Gout-de-l-esprit (22 Dec 2021 - 19:35)
Heu ! je suis tout penaud de revenir vers vous.

En effet, à l'occasion d'une mise-à-jour de ma page (prétendument problématique) j'avais uploadé par ftp l'intégralité de tous les fichiers .html .js .php et ... .txt

.txt ?

Or, ce fut une erreur de re-télécharger le fichier .txt ... initialement rédigé du chiffre de 2 mille (histoire d'amorcer-la-pompe, et qui ne le ferait pas ?).

Il ne fut donc pas étonnant que le compteur global affiche alors, par F5 ce nombre (ce chiffre) initial !

Cependant, en cette période que l'on nous annonce d'une "société de surveillance" il semble urgent et chronique de veiller à la protection des données : personnelles, web, ...

Je reviendrai bientôt par-devant Alsa pour soumettre une procédure de protection (inédite ? idiote ? candide ?) d'accès hautement sécurisé de nos données sensibles (tous codes perso confondus) par, notamment (en itinérance) non pas l'iris de l'œil, l'empreinte digitale mais par le temps interne de tout ordi que vous utiliseriez : pour combattre tout crack randomisé.

Alors, à +++ !

Merci à Jencal, à Niuxe, à Alsa !
Modifié par Gout-de-l-esprit (22 Dec 2021 - 20:16)
Salut salut,

tu dit Jencal mais depuis le début c'est Mr parsimonhi qui te répond Smiley smile

mais de rien Smiley smile