technova69/spip-check | 2 commits
Par gilles, le 25 août 2026 à 13h16min :
fix: cibler l’exclusion des bibliothèques embarquées dans les plugins
Le mode approfondi signalait les bibliothèques tierces embarquées par
les plugins : PHPMailer (popen), symfony/process (proc_open), ou
un simple $pdo->exec($sql). Deux causes, deux correctifs.
D’abord le périmètre. Écarter tout répertoire nommé vendor depuis
FileIndexer aurait rendu le sous-arbre invisible pour toutes les
règles : un IMG/vendor/shell.php, local/vendor/backdoor.php ou
squelettes/vendor/porte.php n’aurait plus été signalé du tout, alors
que ces répertoires sont inscriptibles depuis le web et que le nom de
dossier à utiliser est public. L’indexeur parcourt donc l’arborescence
complète — seul le vendor/ de la racine, distribué par l’archive,
reste écarté — et l’exclusion passe au niveau de la règle :
inspectScript() ignore plugins/*/(…/)?(vendor|lib)/, que SPIP
n’auto-charge pas.
Ensuite la détection elle-même. hasPluginWebshellMarker()
travaillait sur le texte brut : une chaîne, un commentaire ou un appel
de méthode suffisaient à déclencher un signalement. Elle passe par
token_get_all(), comme isCvtForm(), et ne retient qu’un appel
direct — nom de fonction suivi de (, non précédé de ->, ?->,
::, function ou new. Les noms qualifiés PHP 8 (\exec()
restent détectés.
Co-Authored-By: Claude Opus 5 noreply@anthropic.com
Modifié
spip-check.php
src/SpipCheck.php
tests/unit/FileIndexerTest.php
tests/unit/ScannerTest.php
Détails : https://git.spip.net/technova69/spip-check/-/commit/6588eda679f88c42b4ee4b4d5457e670ff91b1c5
==============================
Par gilles, le 25 août 2026 à 13h15min :
fix: fiabiliser le curseur d’analyse et la sélection déplaçable
Le curseur de scanBatch() avançait jusqu’au dernier candidat du lot
découpé, y compris lorsque le budget de temps interrompait la boucle
avant : les fichiers non scannés étaient silencieusement sautés et
done (alreadyScanned + scanned >= totalCandidates) n’était jamais
atteint, laissant l’étape analyser boucler indéfiniment. Le curseur
est désormais l’id du dernier candidat réellement scanné.
ResultSelection::group() calculait selectable sur la seule
existence du fichier et ignorait le champ fixable produit par les
règles. Un immutable_modified sur un fichier du cœur SPIP était donc
cochable, et « Tout sélectionner » + DEPLACER cassait le site. Une
ligne n’est cochable que si elle porte au moins un finding déplaçable ;
les autres écarts restent signalés pour revue manuelle. Le README
décrit la règle exacte.
Co-Authored-By: Claude Opus 5 noreply@anthropic.com
Modifié
README.md
spip-check.php
src/SpipCheck.php
tests/unit/IndexedScannerTest.php
tests/unit/ResultSelectionTest.php
Détails : https://git.spip.net/technova69/spip-check/-/commit/e5081585e6cc9c1b5f89d487e0eee531c51b5df0