Mike ha una buona risposta. Non so perché è stato votato in ribasso (quindi l'ho votato di nuovo). Mi sono appena iscritto quindi non posso commentare, ma mi piacerebbe provare a spiegare il ragionamento di Mike, perché sta facendo un buon punto.
La domanda originale era:
One of our scripts uses a $_SESSION variable and I'm not sure if that is vulnerable to manipulation from outside as a $_POST variable is...
Interpreto questo come chiedendo, "l'utente è in grado di manipolare $ _SESSION direttamente dalla richiesta HTTP, come può fare con $ _COOKIE, $ _POST e $ _GET?"
In altre parole, PHP prenderà letteralmente i dati dell'utente dagli header o dal corpo della richiesta e li nasconderà in questi tre superglobali. Ma farà la stessa cosa per $ _SESSION?
La risposta è (nella maggior parte dei casi) decisamente no. La memoria di sessione predefinita in PHP è "file", il che significa che le sessioni sono serializzate e scritte in un file sul filesystem locale. L'utente non ha modo di manipolare direttamente i contenuti di una sessione.
Ora, come altri hanno sottolineato sopra, se fai qualcosa del genere:
$_SESSION['foo'] = $_POST['bar'];
Quindi l'utente può ora influenzare $ _SESSION indirettamente influenzando $ _POST! Naturalmente questo è vero, ma non ho visto questo come il punto della domanda. L'utente può influenzare qualsiasi cosa se non si disinfettano gli input dell'utente. Il punto è sapere quali input non sono disinfettati e sapere come disinfettarli prima di usarli.
Le critiche di Karrax sopra erano:
If XSS changes values on the client which is then used in the session variable you have successfully changed the $_SESSIOn by using XSS.
Naturalmente questo è vero, ma non è il punto della domanda. Secondo la tua logica, possiamo anche dire che "l'input dell'utente malintenzionato può lanciare un razzo sulla luna". Questa è una vera affermazione se qualcuno della NASA ha dimenticato di disinfettare i propri input utente nell'applicazione di controllo del razzo, ma questo è un problema con il software della NASA, non un rischio intrinseco in PHP.
Sfortunatamente, PHP non rende ovvio quali superglobali non sono macchiati e che sono contaminati. Comprendere la distinzione richiede una comprensione di livello intermedio del protocollo HTTP e il modo in cui il runtime di PHP elabora il ciclo di richiesta e risposta HTTP.