fix: le texte des erreurs PHP ne s affiche plus au visiteur en production #168

Merged
Corentin merged 1 commit from fix/display-errors-from-app-debug into dev 2026-09-26 16:02:35 +02:00
Owner

L image PHP-FPM embarque display_errors = On, et le commentaire de php.ini annoncait une surcharge par docker-compose.prod.yml qui n a jamais ete ecrite. La pile de demonstration servait donc le texte des erreurs PHP a n importe quel visiteur : constate le 2026-09-26 sur le conteneur en marche (display_errors=1, APP_DEBUG=true).

La destination d une erreur est desormais derivee d APP_DEBUG dans le code, au demarrage, donc elle suit le deploiement partout. Ce qui change entre les deux modes est l endroit ou part l erreur, pas ce qui est rapporte : error_reporting reste a E_ALL et le journal reste actif.

display_startup_errors est volontairement absent de la politique appliquee au demarrage (une erreur de demarrage precede le point d entree, aucun ini_set ne peut plus la masquer) : elle est traitee dans le php.ini de l image, passe a Off.

Mesure sur l image, en partant de display_errors=1 : sans APP_DEBUG -> 0, APP_DEBUG=false -> 0, APP_DEBUG=true -> 1 ; log_errors=1 et error_reporting=E_ALL dans les trois cas.

Tests : 1684 PHP (4866 assertions), 350 JS, PHPStan niveau 6 propre.

L image PHP-FPM embarque display_errors = On, et le commentaire de php.ini annoncait une surcharge par docker-compose.prod.yml qui n a jamais ete ecrite. La pile de demonstration servait donc le texte des erreurs PHP a n importe quel visiteur : constate le 2026-09-26 sur le conteneur en marche (display_errors=1, APP_DEBUG=true). La destination d une erreur est desormais derivee d APP_DEBUG dans le code, au demarrage, donc elle suit le deploiement partout. Ce qui change entre les deux modes est l endroit ou part l erreur, pas ce qui est rapporte : error_reporting reste a E_ALL et le journal reste actif. display_startup_errors est volontairement absent de la politique appliquee au demarrage (une erreur de demarrage precede le point d entree, aucun ini_set ne peut plus la masquer) : elle est traitee dans le php.ini de l image, passe a Off. Mesure sur l image, en partant de display_errors=1 : sans APP_DEBUG -> 0, APP_DEBUG=false -> 0, APP_DEBUG=true -> 1 ; log_errors=1 et error_reporting=E_ALL dans les trois cas. Tests : 1684 PHP (4866 assertions), 350 JS, PHPStan niveau 6 propre.
fix: keep PHP error text off the visitor's screen in production
All checks were successful
CI / secret-scan (pull_request) Successful in 20s
CI / php-lint (pull_request) Successful in 24s
CI / static-tests (pull_request) Successful in 2m40s
CI / js-tests (pull_request) Successful in 45s
CI / secret-scan (push) Successful in 23s
CI / php-lint (push) Successful in 28s
CI / static-tests (push) Successful in 2m39s
CI / js-tests (push) Successful in 42s
f9fd9cbbb3
The PHP-FPM image ships display_errors = On, and the comment in php.ini claimed a
production override in docker-compose.prod.yml that was never written. The public
demonstration stack was therefore serving PHP error text - file paths, query
fragments, call context - to any visitor: observed 2026-09-26 with display_errors=1
and APP_DEBUG=true on the running container.

The destination of an error is now derived from APP_DEBUG in the code, at bootstrap,
so it follows the deployment everywhere instead of depending on a compose override a
deployment can forget. What changes between the two modes is where the error goes,
not what is reported: error_reporting stays at E_ALL and log_errors stays on, because
hiding an error from a visitor must not mean losing it for the operator.

display_startup_errors is deliberately absent from the runtime policy: a startup
error precedes the entry point, so no ini_set can mask it afterwards. It is handled
in the image php.ini, now Off.

Measured on the image, starting from display_errors=1: no APP_DEBUG -> 0,
APP_DEBUG=false -> 0, APP_DEBUG=true -> 1; log_errors=1 and error_reporting=E_ALL in
all three.
Corentin scheduled this pull request to auto merge when all checks succeed 2026-09-26 15:54:13 +02:00
Sign in to join this conversation.
No reviewers
No labels
auto-merge
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
AcadeNice/corentin_wakdo!168
No description provided.