2011-01-16 4 views
4

J'expérimente la politique de sécurité du contenu de Firefox. Fondamentalement, c'est un en-tête spécial pour la page Web qui indique au navigateur quelles ressources sont valides.

Lorsqu'une ressource est invalide parce qu'elle ne respecte pas la politique, Firefox envoie un rapport à un URI donné au format json.

Ceci est un rapport typique

array(1) { 
    ["csp-report"]=> 
    array(4) { 
    ["request"]=> 
    string(71) "GET http://example.com/?function=detail&id=565 HTTP/1.1" 
    ["request-headers"]=> 
    string(494) "Host: example.com 
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:2.0b10pre) Gecko/20110115 Firefox/4.0b10pre 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: es-ar,en-us;q=0.8,es;q=0.5,en;q=0.3 
Accept-Encoding: gzip, deflate 
Accept-Charset: UTF-8,* 
Keep-Alive: 115 
Connection: keep-alive 
Referer: http://example.com/index.php?function=search&query=Pata+de+cambio+ 
Cookie: the cookie 
" 
    ["blocked-uri"]=> 
    string(4) "self" 
    ["violated-directive"]=> 
    string(30) "inline script base restriction" 
    } 
} 

Le type de contenu est une application/JSON; charset = UTF-8

Maintenant. Je m'attendrais à ce que cela soit disponible dans $ _POST comme REQUEST_METHOD == POST mais le post est toujours vide. Je peux y accéder depuis php: // input, mais la question est: Pourquoi la requête n'est pas disponible dans $ _POST?

Je ne peux même pas utiliser filter_input et $ _REQUEST est vide ...

Répondre

8

$_POST vous donne une forme de variables qui apparaissent dans la page comme ceci:

POST /some_path HTTP/1.1 

myvar=something&secondvar=somethingelse 

Mais ce que vous êtes getting n'est pas une chaîne de requête valide. Il ressemble probablement quelque chose comme ceci:

POST /some_path HTTP/1.1 

{'this':'is a JSON object','notice':'it\'s not a valid query string'} 

php://input vous donne tout ce qui suit les en-têtes sous forme brute, dans ce cas je pense qu'il est la seule façon d'obtenir ce que vous voulez.

+0

mmm, je pense que vous avez un point là. mais généralement les données json sont envoyées à travers les messages sans problèmes. Pourquoi fais-tu dans ce cas particulier et pas avec un post via javascript? –

+0

@The Disintegrator: J'ai très peu d'expérience avec cela, mais le framework que j'ai utilisé (ExtJS) convertit les objets JSON en chaînes de requête. –

+0

@BrendanLong. Vous aurez envie d'échapper à cette apostrophe dans * c'est *. – TRiG

1

Il peut s'agir de plusieurs autres types de requêtes http (j'en connais 7 en ce moment, et plusieurs emplacements pour d'autres à venir).
Je voudrais imprimer le $_REQUEST et $_SERVER pour voir comment il arrive réellement.

+0

aucun n'a le rapport. $ _REQUEST est vide et $ _SERVER a les données typiques –

7

Si une demande est envoyée comme POST, elle n'est pas nécessairement codée comme application/x-www-form-urlencoded ou multipart/form-data. Si Firefox envoie un corps JSON, alors PHP ne sait pas comment le décoder. Vous devez vérifier $_SERVER["HTTP_CONTENT_TYPE"]. Si elle contient application/json alors vous devez en effet lire php: // stdin:

if (stripos($_SERVER["HTTP_CONTENT_TYPE"], "application/json")===0) { 
    $_POST = json_decode(file_get_contents("php://input")); 
// or something like that