OVH Community, votre nouvel espace communautaire.

Content-Type "application/json" et erreur 403


Gaston_Phone
16/09/2015, 08h49
Ce "firewall applicatif" est source de nombreux problèmes semble-t-il.

- - - Mise à jour - - -

Personnellement j'ai décoché ce "firewall applicatif" sur tous mes sites.

Jikoo
16/09/2015, 01h33
Merci CoolyMan. C'est sympa de partager la résolution de problème.

CoolyMan
09/09/2015, 17h05
Bon ben décidément je me fait les questions/réponses tout seul.

J'ai fini par résoudre mon problème. Et vu que je déteste ceux qui ferme un sujet en disant "J'ai trouvé !", je vais vous dire comment.

En fait, il se trouve que pour les anciens clients (j'ai pas de date exacte, mais je suis client depuis de très nombreuses années), le "firewall applicatif" est activé par défaut, indépendament du .htaccess et du .ovhconfig.
En fait, ce paramètre n'est même accessible que depuis l'ancien manager (v3 je crois).

Une fois désactivé ce firewall applicatif depuis l'ancien manager, il faut attendre une petite demi-heure que la modification soit prise en compte.

Et voila ! Problème résolue

CoolyMan
09/09/2015, 15h21
Bon ben visiblement ça ne motive pas les foules

Alors, j'ai réussi à récupérer l'accès à mes logs et j'ai bien avancé.

Voici ce que me dit le log :
Code:
ModSecurity: Access denied with code 403 (phase 2). Match of "within %{tx.allowed_request_content_type}" against "TX:0" required. [file "/usr/local/apache2/conf/modsecurity/base_rules/modsecurity_crs_30_http_policy.conf"] [line "63"] [id "960010"] [msg "Request content type is not allowed by policy"] [data "application/json"] [severity "WARNING"] [tag "POLICY/ENCODING_NOT_ALLOWED"] [tag "WASCTC/WASC-20"] [tag "OWASP_TOP_10/A1"] [tag "OWASP_AppSensor/EE2"] [tag "PCI/12.1"] [hostname "XXXX"] [uri "/xxx/yyy"] [unique_id "VfApUQoATRQAAC8zeegAAABL"]
Donc vraisemblablement c'est le mod_security qui filtre les requêtes (POST) dont le "Content-Type" est "application/json".

Or, ce que je ne comprend pas, c'est que comme vous pouvez le voir dans mon .ovhconfig, le firewall est désactivé (et d'après la doc, le firewall c'est mod_security).

De plus, j'ai essayé de désactiver mod_security dans mon .htaccess :
Code:
SecFilterEngine Off
SecFilterScanPOST Off
Mais là encore, rien n'y fait.

Donc j'ai bien avancé, mais je n'ai pas réglé mon problème pour autant.

Quelqu'un à une idée ?

CoolyMan
08/09/2015, 19h03
Bonjour à tous,

Je me permet de faire appel à l'aide de la communauté OVHienne pour essayer de résoudre mon problème.
J'ai contacté le support, mais je n'ai toujours aucune réponse de leur part, alors j'espère que je vous allez pouvoir me tirer de mon désespoir

J'ai mis en place une règle d'URL Rewriting que voici :
Code:
RewriteRule api/(.*)$ api/entrypoint.php?request=$1 [QSA,NC,L]
Donc, tout ce qui arrive sur "/api/xxx/yyy" est renvoyé vers "/api/entrypoint.php?request=xxx/yyy".
Cette règle fonctionne très bien la plupart du temps. Une requête en GET ou DELETE par exemple est bien redirigé vers mon fichier "entrypoint.php"

J'ai cependant constaté un fonctionnement très étrange sur les requête POST et PUT.
Lorsque j'effectue une telle requête en passant un "Content-Type" à "application/x-www-form-urlencoded" ou "multipart/form-data" par exemple, là encore aucun souci. En revanche, dès que j'utilise le "Content-Type" "application/json", je me paye une erreur 403 me disant que je n'ai pas le droit d'accéder au dossier "api/xxx/yyy".

Cela fait plusieurs heures que j'essaye de me dépatouiller de ce problème mais rien n'y fait. Google n'a rien donné pour m'aider. Je commence à être très très désespéré.

Je ne suis même pas sûr que ce soit lié à l'URL Rewriting en fait, car même une requête directe sur mon fichier "api/entrypoint.php?request=xxx/yyy" fonctionne sans souci en GET/DELETE ou POST/PUT avec le "Content-Type" qui va bien, mais plus du tout dès que le "Content-Type" vaut "application/json".

D'autant plus que cette même configuration fonctionnait très bien en local sur mon EasyPHP...

Pour information, voici le contenu complet de mon .htaccess :
Code:
Options -Multiviews +FollowSymLinks -Indexes

RewriteEngine on

RewriteBase /evr/

RewriteRule api/(.*)$ api/entrypoint.php?request=$1 [QSA,NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !(.*)/modules/(.*)
RewriteRule ^(.*) index.php [NC,L]

et de mon .ovhconfig
Code:
; ovhconfig
;
; this file must be placed in $HOME/.ovhconfig or in $DOCUMENT_ROOT/.ovhconfig

; __app.engine__
;
; values: php (php engine + opcache accelerator)
; notice: if php, a phpcgi engine will be activated as fallback (if previous engine crash)
;
;   php:
;       IMPORTANT: register_globals and magic_quotes_gpc are off for security
;       php options .htaccess (like php version) are ignored
;   phpcgi:
;       IMPORTANT this is a fallback or previous system
;       in this case __app.engine.version__ will be considerated as AUTO and php version will be old system
;       (meaning depending .htaccess or .phpX extension)
;
app.engine=php

; __app.engine.version__ specify version of your engine
;
; for php:
;   default: 5.4
; for phpcgi:
;   this options is ignored (= fallback in AUTO)
;
app.engine.version=5.6

; __http.firewall__ used to add application firewall  (filter http requests)
;
; values: none | security
; default: none
;
http.firewall=none

; __environment__
;
; values: production | development
;
;   production:
;       apache will maximise local cache
;       mod_expires will grow up TTL of js, css, pdf, images, video, audio
;       you can override it changing expiration explicitly or in your .htaccess
;       feel free to look on our guide.
;   development:
;       no expiration is added, files are not locally in cache,
;       will speed up tests but decrease performances
;
; choosen environment will also be available in your variable ENVIRONMENT unix env
;
; default: production
;
environment=development
Merci à tous de m'avoir lu jusque là et j'espère que quelqu'un à une idée, parce que moi, vraiment, je sèche...