Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .claude/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@ Politique unique dans `App\Security\SecurityHeaders`, appliquée par le Kernel
- Les assets servis directement par Apache (CSS, JS) reçoivent `nosniff` via `public/.htaccess`.
- JS : tout HTML construit côté client échappe ses données avec `escapeHtml` de `assets/js/html.js` (module unique).

## Analyse de teinte (#433)

`composer taint` (Psalm, `psalm.xml`, en CI) suit les valeurs de la requête jusqu'aux puits SQL, HTML, commande et fichier. **Sources** : `Request::query/body/allBody/header/path/file` (annotation `@psalm-taint-source input`) ; **puits SQL** : PDO (`tools/psalm/pdo.phpstub`, Psalm ne les marque pas seul) ; HTML : `echo` et `htmlspecialchars` (donc `e()`) comme échappement. Un nouvel accès aux données de la requête doit passer par `Request` (sinon la source n'est pas vue). Faux positif légitime : `@psalm-suppress Tainted…` AVEC la raison, jamais de baseline. `tests/Tools/PsalmTaintTest` pose des flux tachés (fixture) et vérifie que l'outil les détecte : si Psalm ou les annotations se dégradent, il échoue.
## Limites par personne et bornes de stockage (#428, #442, #443)

- **`UserActionLimit`** (`Account\Service\Throttle`, sur `SubjectThrottle`) : N actions par personne connectée dans une fenêtre, sinon `RateLimitedException` → **423** + `Retry-After` (voir « 423, jamais 429 »). Une action refusée n'est pas comptée. En place : recherche de membres (120 par minute), envoi de documents (20 par heure). Branchement : paramètre optionnel du contrôleur, câblé dans `services.php` (`limit.*`).
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ jobs:
- name: Audit dependencies
run: composer audit

# Suivi des données non fiables (#433) : une valeur de la requête qui atteint SQL, HTML, commande ou fichier sans être
# neutralisée fait échouer la CI. Sources : Request (annotations `@psalm-taint-source`), puits SQL : tools/psalm/pdo.phpstub.
- name: Taint analysis (Psalm)
run: ./vendor/bin/psalm --taint-analysis --no-cache --threads=2 --no-progress

- name: Static analysis (PHPStan)
run: ./vendor/bin/phpstan analyse --no-progress --memory-limit=512M

Expand Down
6 changes: 4 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.95",
"phpstan/phpstan": "^2.2",
"phpunit/phpunit": "^13.4"
"phpunit/phpunit": "^13.4",
"vimeo/psalm": "^6.20"
},
"autoload": {
"psr-4": {
Expand All @@ -26,7 +27,8 @@
}
},
"scripts": {
"test:quick": "phpunit --exclude-group db"
"test:quick": "phpunit --exclude-group db",
"taint": "psalm --taint-analysis --no-cache --threads=2 --no-progress"
},
"config": {
"sort-packages": true
Expand Down
Loading
Loading