setcookie funziona anche dopo aver inviato output al browser

Ciao a tutti,

stavo giust'appunto vagando per la rete leggendo articoli su articoli. Leggendo pareri e spiegazioni differenti riguardo la funzione setcookie() e il suo collocamento nella pagina web da costruire ho notato...

...che il manuale dice:

Like other headers, cookies must be sent before any output from your script (this is a protocol restriction). This requires that you place calls to this function prior to any output, including <html> and <head> tags as well as any whitespace.

Questa la pagina di riferimento: http://php.net/manual/en/function.setcookie.php

Ecco. Come potete vedere il manuale ufficiale dice che "tassativamente" (è un must), la funzione dev'essere impostata prima di mandare in output qualcosa e/o anche prima dei tag <html> e <head> ...ma...

..allora perchè io (in locale) faccio funzionare il mio script inviandolo tra i tag <head> bla bla </head> ???

Qui il mio codice per farvi capire:

<html> 
 <head> 

<?php 

  if (mia operazione) { 

    setcookie("bla", "blabla", "scadenza"); 

  } 

 # Che poi fondamentalmente faccio uso della funzione require("file-con-funzione-cookie"); 
?> 

</head> 
  
// ..resto del contenuto della pagina..

In conclusione:

- Sono io che mi illudo che lo script in locale riesca a settare il cookie?

- Oppure veramente è possibile adottare questo metodo...cioè riuscire a far funzionare il settaggio di un cookie ANCHE dopo l'invio in output delle righe di codice <html> e <head> ???

Grazie a tutti.

inviato 5 anni fa
wartpro
modificato 5 anni fa
Andrea Turso
Andrea Turso
86
Può essere in dipendenza del funzionamento del tuo browser...Mario Santagiuliana 5 anni fa
Mmmh dici? No perchè non riesco a spiegarmelo. Il manuale ufficiale dice il contrario. Comunque utilizzo Chrome.wartpro 5 anni fa
Il manuale riporta le specifiche da adottare. Se funziona posso immaginare che il browser in questione interpreti le specifiche in modo più "libertino"...Mario Santagiuliana 5 anni fa
Mh vabè. Sarà. Io per "sicurezza" l'ho messo (come da manuale) a inizio pagina....meglio evitare :) Grazie Mario!  :coolsmiley:wartpro 5 anni fa
X 0 X

La spiegazione più semplice è che tu stai utilizzando esplicitamente, all'interno del tuo script con la funzione ob_start, o implicitamente, con la direttiva php.ini output_buffering impostata a On, il sistema di Output Buffering di PHP per cui anche se prima della chiamata a setcookie c'è dell'output non viene generato nessun errore perché quell'output (e quindi il corpo della risposta, che necessariamente viene inviato dopo l'invio degli header) viene inviato in un colpo solo alla fine dello script.

Infatti usando l'output buffering il motore di PHP raccoglie tutto l'output in un buffer che viene inviato al browser solo alla fine dell'esecuzione dello script, evitando così la situazione di errore "Headers Already Sent [...]".

L'output buffering serve in casi particolari in cui si vuole modificare il contenuto della pagina all'interno dello script prima di inviarlo al browser. Questo ovviamente a discapito della velocità di esecuzione e a costo di un maggiore utilizzo di memoria.

In realtà commettere questo genere di "errore" non è un problema di sicurezza quanto più una Worst Practice, infatti in qualunque tipo di trasmissione con datagram i dati vengono inviati essenzialmente in due blocchi logici: header (intestazione) e payload o body (corpo del messaggio). È per questo che non ha alcun effetto (ecco spiegato il motivo del Warning generato da PHP) e nessun senso cercare di modificare gli Header quando questi sono già arrivati a destinazione.

Sarebbe un po' come cercare di modificare una lettera inviata ad un'amico quando questa è già stata recapitata al destinatario.

risposto 5 anni fa
Andrea Turso
Andrea Turso
86
modificato 5 anni fa
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda