Tipo de arquivo desconhecido MIME?

140

Preciso especificar um tipo MIME se o arquivo carregado não tiver extensão? Em outras palavras, existe um tipo MIME geral padrão?

Shimmy Weitzhandler
fonte

Respostas:

184

Você pode usar application/octet-streampara tipos desconhecidos.

A RFC 2046 declara na seção 4.5.1:

O subtipo "fluxo de octetos" é usado para indicar que um corpo contém dados binários arbitrários.

Bombe
fonte
3
Na verdade, de acordo com as RFCs, você não deve enviar nenhuma informação de tipo com dados desconhecidos. O RFC-2046 define apenas tipos conhecidos, mas o RFC-7231 informa como lidar com tipos desconhecidos.
Sampo Sarrala - codidact.org
@ SampoSarrala Eu li a RFC-7231 de maneira um pouco diferente: "Se um campo de cabeçalho do tipo Content não estiver presente, o destinatário PODE assumir um tipo de mídia de" application / octet-stream "([RFC2046], seção 4.5.1) ou examine os dados para determinar seu tipo ". Interpreto que, como devemos enviar NO Content-Type, ou estamos seguros para enviar application / octet-stream como padrão, se não queremos que os clientes joguem jogos de adivinhação com exame de conteúdo.
Jpnh
1
@Jpnh Sim, está certo. O cabeçalho do tipo de conteúdo não deve estar presente sempre que for desconhecido. Pode-se também enviar application / octet-stream, que basicamente diz ao cliente que " você não deseja exibi-lo agora, mas continue e salve esses bytes no arquivo ". Isso faz com que os clientes da Web ofereçam arquivos salvos. Opção 1 == Não sabe nada sobre este arquivo. Opção 2 == O conteúdo do arquivo não pode ser descrito usando mime ou deve ser salvo apenas no disco. Na prática, qualquer uma das opções estaria correta. Eu deveria ter escolhido uma melhor redação para evitar confusão.
Sampo Sarrala - codidact.org
4
"Dados binários arbitrários" não é "desconhecido". Ao usar application / octet-stream, você informa ao navegador que o tipo de conteúdo é conhecido, não é texto nem imagem, mas dados binários arbitrários e, como resultado, deve ser baixado para arquivo e possivelmente executado. Além de estar errado, essa é uma falha de segurança, especialmente considerando os gerenciadores de download modernos pouco visíveis. A resposta certa é nenhum cabeçalho do tipo de conteúdo. Se você não sabe que tipo de arquivo é, o navegador pode conhecê-la tão deixá-lo adivinhar, especialmente quando se sabe o contexto de uso (imagem, documento, roteiro, ...)
FF_Dev
@FF_Dev Tenho certeza que isso é um absurdo. "Dados binários arbitrários" não implica "executável"; não há motivo para um navegador (ou gerenciador de downloads) assumir que um application/octet-streamarquivo é executável. E mesmo que um navegador esteja baixando conscientemente um arquivo executável, ele "possivelmente não será executado" sem que o usuário solicite; apenas o download de um executável não implica que eu queira que ele seja executado agora. Se realmente houver um navegador que possa executar application/octet-streamarquivos automaticamente no download, informe-nos quais e como reproduzir o comportamento. Agora eu não acredito em você.
precisa
38

Recursos RFC:

Devemos usar o RFC-7231 (semântica e conteúdo HTTP / 1.1) como referência, em vez do RFC-2046 (tipos de mídia), porque a pergunta era claramente sobre o tipo de conteúdo HTTP.

Também o RFC-2046 não define claramente tipos desconhecidos, mas o RFC-7231 define.

Resposta curta:

Não envie o tipo MIME para dados desconhecidos.
Para ser mais claro: não use o cabeçalho Content-Type.

Referências:


Protocolo de transferência de hipertexto RFC-7231 (HTTP / 1.1): Semântica e conteúdo
3.1.1.5. Tipo de conteúdo

Um remetente que gera uma mensagem contendo um corpo de carga útil deve
gerar um campo de cabeçalho de tipo de conteúdo nessa mensagem, a menos que o
tipo de mídia pretendido da representação em anexo seja desconhecido para o
remetente.

Essa seção diz claramente para você deixar de fora se não souber ao certo. Também diz que o receptor pode assumir que o tipo é application / octet-stream, mas o fato é que também pode ser outra coisa.

O que é diferente então?

RFC-2046
4.5.1. Subtipo de fluxo de octeto

A ação recomendada para uma implementação que recebe uma
entidade "application / octet-stream" é simplesmente oferecer os dados
em um arquivo, com qualquer codificação de transferência de conteúdo desfeita, ou talvez
usá-los como entrada para uma especificação especificada pelo usuário processo.

E, como já mencionado acima:

RFC-7231
3.1.1.5. Tipo de conteúdo

Se um campo de cabeçalho Content-Type não estiver presente, o destinatário PODE assumir um tipo de mídia de "application / octet-stream"
([RFC2046], Seção 4.5.1) ou examinar os dados para determinar seu tipo.

Conclusão:

Se você defini-lo como "application / octet-stream", está dizendo que sabe que é "application / octet-stream".

Se você não defini-lo, estará dizendo que não sabe o que é e deixe a decisão para o destinatário e o destinatário poderá verificar se ele anda como pato e ...

Sampo Sarrala - codidact.org
fonte
1
Essa resposta merece votos positivos, pois é a única na verdade. Além disso, o uso de "application / octet-stream", por padrão, faz com que a maioria dos downloads de acionadores de navegador seja uma falha de segurança, considerando os gerenciadores de download modernos quase invisíveis.
FF_Dev 01/03
1
Isso está correto para HTTP, mas a pergunta é sobre MIME em geral, não sobre HTTP. No email, por exemplo, as regras são completamente diferentes. Consulte também a discussão em stackoverflow.com/questions/12539058/…
tripleee
Eu dei um aumento pela mesma razão, no entanto, eu concordo com FF_Dev. A menos que a intenção seja "application / octet-stream" e para acionar um download, é necessário "application / unknown". Seria bom se os navegadores não tentassem fazer o download do arquivo se o "Content-Disposition" não estivesse definido, mas existem muitos sites fazendo o download de arquivos aleatoriamente sem definir o nome do arquivo para uso. Especialmente bancos.
Just2623
14

Eu prefiro application/unknown, mas o resultado será certamente o mesmo queapplication/octet-stream

Lada
fonte
17
Existe um padrão que permita usar application / unknown em vez de application / octet-stream?
Hendrik Brummermann
3
Obrigado! application / unknown está funcionando muito bem, o octet-stream resulta em um erro no chrome no meu arquivo png de amostra!
Fnkr
10
Por que servir um arquivo .png como application/octet-streamou application/unknown? Há uma razão que eles inventaram image/png.
Aidiakapi
10
@ jenson-button-event Não tem nada a ver com reinventar a roda. O tipo MIME especifica sua intenção. Se você sabe que o que está enviando é uma imagem png, transmita essas informações. Se os bytes representam acidentalmente um jpeg, seu aplicativo pode avisá-lo de que não é um png válido e de que há um bug em outro lugar. Além disso, nem todos os aplicativos são tão robustos e tolerantes a falhas quanto um navegador. Eles foram projetados para corrigir os erros do programador, mas isso não chega nem perto de ser apenas um objetivo. Um navegador não é o único aplicativo que usa tipos MIME.
Aidiakapi
2
Qual é a sua referência? o tipo desconhecido não está contribuindo com nenhuma informação sobre o conteúdo ou o estado do arquivo, ou mesmo se for binário ou baseado em texto, é muito obscuro para o código de produção, pode ser bom para um projeto pequeno, pois se um tipo de arquivo não tiver manipulador no sistema operacional, ele é essencialmente um binário para download e o tipo desconhecido é um identificador conhecido no sistema operacional Windows, que você pode atribuir uma ação (por exemplo, abrir arquivos desconhecidos com o bloco de notas). Embora seja uma prática ruim, você pode usar o tipo desconhecido combinado com isso para ignorar qualquer execução: /