Problème sécurité : injection Mysql (bis)

Eléphanteau du PHP | 14 Messages

13 déc. 2016, 08:57

Salut,
Je reviens vers vous et vos lumières car j'ai un problème sur mon site :
http://www.freetorrent.fr propose des torrents LIBRES.
Chaque jour, 1 ou 2 torrents sont effacés, fichier torrent et image du torrent compris !
J'ai aussi constaté une intrusion dans une base SQL où une ligne avait été ajoutée et une autre changée...
J'ai donc un soucis et je ne suis pas capable d'y remédier.
Je sais qu'avec aussi peu d'info, ca va être compliqué d'aller + loin... mais pourriez-vous m'orienter vers des pistes de recherches de faille ?
J'ai essayé d'être rigoureux, en affichage de page, et de "protéger" tout ce qui vient de la base avec htmlspecialchars.
Mais, vous l'aurez compris, le problème se situerait plutôt en "entrée" ...
Pour info, j'utilise PDO et des requetes "prepare" + bindValue.
Un grand merci à vous !
Bien belle journée !

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8683 Messages

13 déc. 2016, 15:03

salut,

commence par vérifier tout les champs 'input' qui permettent d'accéder à la base (a priori le formulaire de recherche ne pose a de soucis ave les ' ou " :) je ne suis pas allé plus loin).

regarde du coté de possibilité que tu offres pour la gestion des torrents (ajout, suppression etc).

si la suppression c'est une action avec requête serveur pour dire action = delete id=42 alors c'est une erreur il faut, par exemple, coupler cela avec le fait d'être l'auteur du torrent ou être admin.
c'est très simple de mettre une url dans un navigateur et de choper l'id d'un torrent qui n'est pas a toi pour faire autre chose avec :)

juste en passant, afficher l'ip de la personne connecté c'est inutile et vu que tu sembles les stocker n'oublie pas la déclaration à la cnil ;)
idem pour l'utilisation des cookies de traking tu dois en informer le visiteur (google et compagnie).
vu le sujet 'sensible' de ton site, ce sont des obligation légale que te ne devrait pas négliger.

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 14 Messages

13 déc. 2016, 20:28

Salut,

Merci pour ces conseils...

1 - Voila en gros comment je gère l'édition, suppression des torrents (considérés comme des articles avec une présentation, une image et un lien de téléchargement) :
<?php
if(isset($_SESSION['username']) && isset($_SESSION['userid'])) {
      if(($row['postAuthor'] == $_SESSION['username']) || ($_SESSION['userid'] == 1)) {
            echo '<a style="text-decoration: none; padding-left: 100px;" href="admin/edit-post.php?id='.html($row['postID']).'"><input type="button" class="button" value="Editer" /></a>';
?>
            <a style="text-decoration: none;" href="javascript:delpost('<?php echo html($row['postID']); ?>','<?php echo html($row['postTitle']); ?>')"><input type="button" class="button" value="Supp." /></a>
<?php
      }
}
?>
... html() étant une fonction à base de htmlspecialchars.

2 - OK pour l'IP, ...

3 - Sujet sensible ?... c'est à dire ? ... le fait d'utiliser le protocole Bittorrent ou de diffuser des médias libres ?

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7127 Messages

13 déc. 2016, 20:58

Je rejoins l'avis de Moogli sur le fait qu'il faut que tu vérifies comment s'effectue la suppression (de façon légitime) pour vérifier d'abord que ce ne soit pas juste un bug de ton code sans aucune volonté de personne d'effectuer la suppression.
Après il faudra vérifier si tu fais bien les vérifications de droits au moment de l'action de suppression (et pas que au moment de l'affichage du lien qui correspond au code que tu as donné)

Repère l'endroit du code qui déclenche la requete DELETE dans ta base de données, et regarde quelles sont les conditions/paramètres qui permettent son utilisation.
Si il s'agit d'un paramètre en GET ou POST sans aucune vérification c'est problématique.
Si il s'agit que d'un paramètre en GET, il faut savoir que certains navigateurs internet (ou plutôt certaines extensions/modules de navigateur ou certains proxy) font du "prefetch", c'est à dire qu'ils vont charger les liens à l'avance avant que l'utilisateur ait cliqué dessus, afin de pouvoir afficher encore + rapidement la page.
Sauf que si ton action de suppression est juste avec un paramètre en GET et bien la suppression va avoir lieu lors du prefetch sans même que l'utilisateur clique sur le lien.

La règle est simple : GET pour du contenu à lire, POST pour faire un traitement.
Autrement dit, quand le clic d'un utilisateur doit déclencher une modification des données il faut du POST.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 14 Messages

13 déc. 2016, 21:04

OK merci...
je vais relire ta réponse plusieurs fois car y'a plein d'infos (à mon niveau...) :D