2009-12-17 19 views
0

Un tiers nous envoie un fichier plat qui est censé contenir exclusivement des caractères ASCII imprimables. Cependant, nous avons découvert qu'il existe une chaîne d'environ 50 0x00 octets au milieu du fichier.Quelles sont les ramifications de null octets et multipart/form-data?

Nous voulons être en mesure de télécharger le fichier dans notre application Web, mais j'ai découvert que Django ne semble pas aimer les caractères nuls dans la multipart/form-data. Si je supprime les caractères null, le téléchargement réussit. (Désolé je n'ai pas la trace de pile disponible pour le moment, mais j'en produirai un si nécessaire)

Nous pouvons pré-traiter le fichier pour supprimer les caractères null et/ou travailler avec notre tierce partie pour corriger leur fichier générateur, mais je n'aime pas laisser des problèmes mystiques comme celui-ci.

Cela ressemble-t-il à un bogue dans Django ou y a-t-il un aspect de multipart/form-data que je ne comprends pas complètement? Ai-je besoin de définir un encodage de transfert pour que Django ne soit pas bloqué sur les caractères nuls?

+0

Les octets null fonctionnent très bien, à condition que les en-têtes MIME associés au fichier spécifient que les données de fichier utilisent un codage capable de gérer correctement les caractères null. –

Répondre

0

Non, aucun codage de transfert n'est nécessaire (ou jamais utilisé par les navigateurs) sur les données de formulaire. Il est parfaitement possible d'inclure une série de 50 octets nuls dans une valeur multipart/form-data ... en effet, étant donné que la plupart des fichiers binaires contiennent beaucoup de zéros, cette situation devrait se produire le plus souvent sans téléchargement de fichier!

Ce qui me fait douter si c'est vraiment un bogue de Django, ou s'il n'y a rien d'autre qui se passe. Ayons cette stacktrace!

+1

Pas vrai. Il existe un en-tête "Content-Transfer-Encoding", à savoir: "Content-Transfer-Encoding: binary". Ou utilisez "Content-Type: application/octet-stream" pour envoyer des données arbitraires sans interprétation. –

+0

'Content-Transfer-Encoding' n'est pas autorisé dans HTTP, voir RFC2616 19.4.5. L'encodage est toujours 'binary' ou un synonyme efficace. – bobince

+1

@bobince: CTE n'est pas valide pour l'en-tête global de l'ensemble de la transmission HTTP. Cependant, selon [RFC 2388 section 4.3] (http://tools.ietf.org/html/rfc2388#section-4.3), il est parfaitement valide pour 'multipart/form-data'. La façon dont je lis la spécification, vous devez inclure 'Content-Transfer-Encoding: binary' pour chaque partie qui n'est pas ASCII, même si de nombreuses implémentations réelles ne respectent pas cette exigence. – MvG