2010-09-17 6 views
8

Je passe PHPSESSID à une page PHP (via POST) et je me demandais quelle est la meilleure façon d'assainir l'entrée. Est-ce que mysql_real_escape_string suffirait? Y a-t-il quelque chose de spécial que je devrais prendre en compte en traitant des identifiants de session (je veux dire, ils peuvent seulement être des lettres et des nombres?)?Désinfection PHPSESSID

EDIT: Pour clarifier la question, ce que je veux vraiment savoir est: si quelqu'un falsifie les données POST, peut-il envoyer une chaîne malicieuse comme PHPSESSID qui ferait quelque chose de méchant quand je l'appelle session_id($_GET['PHPSESSID'])? Personnellement, je ne peux pas penser à tout, mais il vaut mieux prévenir que guérir ...

Merci

nico

+0

Pourquoi voulez-vous l'assainir? C'est (le plus souvent) généré automatiquement. – fabrik

+1

+1 pour une bonne réflexion consciente de sécurité –

+0

@abrik: Bien sûr, il est autogénéré, j'étais juste inquiet que quelqu'un puisse usurper les données POST et faire quelque chose de méchant avec elle. Je ne sais pas ce qu'ils pourraient faire, mais c'est pourquoi je posais la question! – nico

Répondre

7

Bonne idée, mais pour autant que je peux voir, il n'y a pas besoin d'aseptiser cette entrée. Le PHPSESSID sera transmis au session_id().

id_session a en effet some limitations:

Selon le gestionnaire de session, tous les caractères sont autorisés au sein de l'identifiant de session. Par exemple, le gestionnaire de session de fichier n'autorise que les caractères dans la plage a-z A-Z 0-9, (virgule) et - (moins)!

Mais doit traiter les écarts par rapport à ces règles avec un message d'erreur. (Vous souhaiterez peut-être attraper ce message d'erreur et terminer le script en cas d'erreur.)

Le seul véritable danger que je peux voir est lorsque vous utilisez un gestionnaire de session personnalisé, par exemple. se connecte à une base de données. Vous devez aseptiser l'entrée dans ce cas, par ex. en utilisant mysql_real_escape_string(). Cependant, c'est quelque chose qui devrait avoir lieu à l'intérieur le gestionnaire de session personnalisé. Il va sans dire que si vous utilisez l'ID de session dans un autre contexte, par exemple un paramètre sous forme HTML, vous devez prendre les mesures d'assainissement nécessaires pour cette sortie spécifique (dans ce cas, htmlspecialchars()).

+4

Merci Pekka, c'était ce que je pensais, mais je pensais qu'il valait mieux poser une question stupide que de faire une bêtise! :) – nico

2

Si vous avez vraiment besoin de passer un ID de session via POST (impossible de voir pourquoi vraiment ...) et que vous savez quels caractères vous voulez autoriser, j'utiliserais une expression régulière pour vérifier cela.

mysql_real_escape_string est pour l'entrée de la base de données et nécessite une connexion à la base de données et ne désinfecte rien, échappant juste à certains caractères spéciaux.

+0

Merci pour la réponse. J'utilise un script qui repose sur Flash et je dois passer PHPSESSID car Flash ne le fait pas automatiquement pour moi ... c'est juste une page et je ne savais pas quels étaient les dangers avec PHPSESSID (s'il y en avait du tout)). Le script se connecte à une BD de toute façon, donc 'mysql_real_escape_string' est venu à l'esprit, mais je n'étais pas sûr si c'était nécessaire du tout. – nico

1

Est-ce que mysql_real_escape_string suffirait?

Mauvais. Vous devriez toujours désinfecter les données en utilisant une méthode appropriée à l'endroit où vous écrivez la valeur. Vous utiliseriez seulement mysql_real_escape_string() si/quand vous écrivez une valeur à une base de données MySQL.

Il n'est pas clair à partir de votre commentaire ce que vous faites exactement. Voulez-vous dire que vous utilisez curl en PHP pour créer le POST? Si c'est le cas, il n'y a pas d'assainissement requis (pas strictement vrai - mais curl le fait pour vous) si vous passez CURLOPT_POSTFIELDS en tant que tableau - mais vous devez urlencode la valeur si vous passez CURLOPT_POSTFIELDS comme une chaîne.

Ecrivez-vous la valeur dans le navigateur afin que l'utilisateur puisse soumettre la valeur? Dans ce cas, vous utiliseriez htmlentities() pour écrire la valeur dans le champ de formulaire.

Quelque chose d'autre?

+0

Vous faites un bon point à propos de 'htmlentities', merci. Comme je le disais à jeroen, la page est appelée par Flash, et les sessions ne sont pas transmises, donc je ne fais que POSTER le PHPSESSID, afin de recréer la session dans le fichier PHP appelé par le Flash. (J'utilise JQuery Uploadify http://www.uploadify.com/ et je passe l'identifiant de session avec le paramètre scriptData, comme ils le suggèrent). – nico

Questions connexes