Čo znamená enctype='multipart/form-data'
vo formulári HTML a kedy ho máme použiť?
Pri odosielaní požiadavky POST musíte údaje, ktoré tvoria telo požiadavky, nejakým spôsobom zakódovať.
Formuláre HTML poskytujú tri spôsoby kódovania.
application/x-www-form-urlencoded
(predvolené)multipart/form-data
text/plain
Pracovalo sa na pridaní application/json
, ale od toho sa upustilo.
(Iné kódovania sú možné pri požiadavkách HTTP generovaných inými spôsobmi ako odoslaním formulára HTML.)
Špecifiká formátov nie sú pre väčšinu vývojárov dôležité. Dôležité sú tieto body:
text/plain
.Keď píšete kód na strane klienta:
<input type="file">
, použite multipart/form-data
.multipart/form-data
alebo application/x-www-form-urlencoded
, ale application/x-www-form-urlencoded
bude efektívnejšíKeď píšete kód na strane servera:
Väčšina z nich (ako napríklad CGI->param
v Perle alebo superglobál $_POST
v PHP) sa o rozdiely postará za vás. Nesnažte sa analyzovať surový vstup prijatý serverom.
Niekedy nájdete knižnicu, ktorá si nevie poradiť s oboma formátmi. Najobľúbenejšia knižnica Node.js'na spracovanie údajov z formulára je body-parser, ktorá nedokáže spracovať viacdielne požiadavky (ale má dokumentáciu, ktorá odporúča niektoré alternatívy, ktoré to dokážu).
Ak píšete (alebo ladíte) knižnicu na parsovanie alebo generovanie surových údajov, musíte sa začať starať o formát. Možno o ňom budete chcieť vedieť aj pre zaujímavosť.
Formát application/x-www-form-urlencoded
je viac-menej rovnaký ako reťazec dopytu na konci adresy URL.
Funkcia multipart/form-data
je podstatne zložitejšia, ale umožňuje zahrnúť do údajov celé súbory. Príklad výsledku možno nájsť v špecifikácii HTML 4.
Funkciu text/plain
zaviedlo HTML 5 a je užitočná len na ladenie - zo špecifikácie: Nie sú spoľahlivo interpretovateľné počítačom - a ja'by som tvrdil, že ostatné v kombinácii s nástrojmi (ako napríklad záložka Net vo vývojárskych nástrojoch väčšiny prehliadačov) sú na to lepšie).
enctype='multipart/form-data
je typ kódovania, ktorý umožňuje odosielanie súborov prostredníctvom POST. Jednoducho povedané, bez tohto kódovania nie je možné súbory odosielať prostredníctvom POST.
Ak chcete používateľovi umožniť odoslať súbor prostredníctvom formulára, musíte použiť tento enctype.
Pri odosielaní formulára poviete svojmu prehliadaču, aby prostredníctvom protokolu HTTP odoslal správu na sieť, ktorá je správne zabalená v štruktúre správy protokolu TCP/IP. Stránka HTML má spôsob, ako odoslať údaje na server: pomocou <form>
s.
Keď je formulár odoslaný, vytvorí sa požiadavka HTTP a odošle sa na server, správa bude obsahovať názvy polí vo formulári a hodnoty vyplnené používateľom. Tento prenos sa môže uskutočniť pomocou metód POST
alebo GET
HTTP.
POST
hovorí prehliadaču, aby vytvoril správu HTTP a celý obsah vložil do tela správy (veľmi užitočný spôsob, bezpečnejší a tiež flexibilnejší).GET
odošle údaje z formulára v reťazci querystring. Má určité obmedzenia týkajúce sa reprezentácie a dĺžky údajov.Atribút enctype
má zmysel len pri použití metódy POST
. Ak je uvedený, dáva prehliadaču pokyn, aby odoslal formulár tak, že zakóduje jeho obsah špecifickým spôsobom. Z MDN - Form enctype:
Keď je hodnota atribútu method post, enctype je MIME
typ obsahu, ktorý sa použije na odoslanie formulára na server.
application/x-www-form-urlencoded
: Toto je predvolené nastavenie. Pri odosielaní formulára sa zhromaždia všetky názvy a hodnoty a na konečnom reťazci sa vykoná URL Encoding.multipart/form-data
: Znaky NIE sú kódované. Toto je dôležité, keď formulár obsahuje ovládací prvok na odosielanie súborov. Chcete odoslať binárny súbor a toto zabezpečí, že bitový tok sa nezmení.text/plain
: Medzery sa konvertujú, ale žiadne ďalšie kódovanie sa nevykonáva.Pri odosielaní formulárov môžu vzniknúť určité bezpečnostné problémy, ako sa uvádza v RFC 7578, časť 7: Údaje viacdielneho formulára - Bezpečnostné aspekty:
Všetok softvér na spracovanie formulárov by mal zaobchádzať s formulárovými údajmi poskytnutými používateľom
citlivo, pretože často obsahujú dôverné alebo osobné údaje identifikačné informácie. Široko sa používa "automatické vypĺňanie formulárov" funkcie vo webových prehliadačoch; tieto môžu byť použité na oklamanie používateľov, aby nevedomky odoslať dôverné informácie pri vypĺňaní inak neškodných úloh. multipart/form-data neposkytuje žiadne funkcie na kontrolu integrity, zabezpečenie dôvernosti, zabránenie používateľovi zámene alebo iným bezpečnostným funkciám; tieto záležitosti musia byť riešiť aplikácie na vyplňovanie formulárov a interpretáciu údajov z formulárov.
Aplikácie, ktoré prijímajú formuláre a spracúvajú ich, musia byť opatrné aby neposkytovali údaje späť na žiadajúcu stránku spracúvajúcu formuláre, ktoré neboli určené na odoslanie.
Je dôležité pri interpretácii názvu súboru Content- Disposition hlavičkového poľa, aby nedošlo k neúmyselnému prepísaniu súborov v priestore pre súbory príjemcu.
To sa vás týka, ak ste vývojár a váš server bude spracovávať formuláre odoslané používateľmi, ktoré môžu nakoniec obsahovať citlivé informácie.