A rigor, a resposta é não . Um desenvolvedor não pode impedir que um usuário faça upload de arquivos de qualquer tipo ou extensão.
Ainda assim, o atributo de aceitação de <input type = "file">
pode ajudar a fornecer um filtro na caixa de diálogo de seleção de arquivo do sistema operacional. Por exemplo,
<!-- (IE 10+, Edge (EdgeHTML), Edge (Chromium), Chrome, Firefox 42+) -->
<input type="file" accept=".xls,.xlsx" />
deve fornecer uma maneira de filtrar arquivos que não sejam .xls ou .xlsx. Embora a página MDN para o input
elemento sempre tenha dito que suporta isso, para minha surpresa, isso não funcionou para mim no Firefox até a versão 42. Isso funciona no IE 10+, Edge e Chrome.
Portanto, para oferecer suporte ao Firefox com mais de 42 anos, juntamente com o IE 10+, Edge, Chrome e Opera, acho melhor usar a lista de tipos MIME separados por vírgula:
<!-- (IE 10+, Edge (EdgeHTML), Edge (Chromium), Chrome, Firefox) -->
<input type="file"
accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel" />
Comportamento [ Edge (EdgeHTML): o menu suspenso do filtro de tipo de arquivo mostra os tipos de arquivo mencionados aqui, mas não é o padrão no menu suspenso. O filtro padrão é All files (*)
.]
Você também pode usar asteriscos nos tipos MIME. Por exemplo:
<input type="file" accept="image/*" /> <!-- all image types -->
<input type="file" accept="audio/*" /> <!-- all audio types -->
<input type="file" accept="video/*" /> <!-- all video types -->
O W3C recomenda que os autores especifiquem os tipos MIME e as extensões correspondentes no accept
atributo. Portanto, a melhor abordagem é:
<!-- Right approach: Use both file extensions and corresponding MIME-types. -->
<!-- (IE 10+, Edge (EdgeHTML), Edge (Chromium), Chrome, Firefox) -->
<input type="file"
accept=".xls,.xlsx, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel" />
JSFiddle do mesmo: aqui .
Referência: lista de tipos MIME
IMPORTANTE: O uso do accept
atributo fornece apenas uma maneira de filtrar os arquivos dos tipos que são de interesse. Os navegadores ainda permitem que os usuários escolham arquivos de qualquer tipo. Verificações adicionais (do lado do cliente) devem ser feitas (usando JavaScript, uma maneira seria essa ), e definitivamente os tipos de arquivo DEVEM ser verificados no servidor , usando uma combinação de tipo MIME usando a extensão de arquivo e sua assinatura binária ( ASP .NET , PHP , Ruby , Java ). Você também pode consultar essas tabelas para tipos de arquivos e seus números mágicos, para executar uma verificação mais robusta do lado do servidor.
Aqui estão três boas leituras sobre upload de arquivos e segurança.
EDIT: Talvez a verificação do tipo de arquivo usando sua assinatura binária também possa ser feita no lado do cliente usando JavaScript (em vez de apenas olhar para a extensão) usando a API de arquivos HTML5, mas ainda assim, o arquivo deve ser verificado no servidor, porque um usuário mal-intencionado ainda poderá fazer o upload de arquivos fazendo uma solicitação HTTP personalizada.