PHP-ի միջոցով ֆայլերի վերբեռնում սերվեր: php լեզվով ֆայլեր սերվեր վերբեռնելու օրինակ (վերբեռնում) Վերբեռնման գործընթացի համար սցենար գրելը

Բայց սկզբում ես կցանկանայի մի քանի խոսք ասել, թե ինչպես են ֆայլերը բեռնվում:

Դա անելու համար մեզ անհրաժեշտ է html ձև՝ տիպի մուտքագրման դաշտով: Բացի այդ, ֆայլերը սերվեր վերբեռնելու համար ձևի տեսակը պետք է սահմանվի բազմամասի: Դա անելու համար multipart/form-data արժեքը նշվում է որպես enctype պարամետր:

Այն բանից հետո, երբ մենք դաշտով ձև տեղադրենք html էջում, բրաուզերի պատուհանում կցուցադրվի դաշտ՝ տեղական համակարգչում ֆայլ ընտրելու հնարավորությամբ:

Այն բանից հետո, երբ օգտատերը ընտրում է ցանկալի ֆայլը և սեղմում «Վերբեռնում» կոճակը, ձևը տվյալները կփոխանցի սերվերի php սկրիպտին, որը նշված է ձևի գործողության մեջ: Եթե ​​ձևի գործողությունը դատարկ է, ապա տվյալները կտեղափոխվեն նույն ֆայլը, որի վրա գտնվում է ձևը: Վերբեռնված ֆայլի մասին բոլոր տեղեկությունները տեղադրվում են $_FILES զանգվածում: Մենք պարզապես պետք է հանենք այս տեղեկատվությունը և տեղափոխենք ֆայլը մեզ անհրաժեշտ վայր:

Նախքան մշակման սցենարը սկսելը բազմաբնույթ ձևեր, դուք պետք է խմբագրեք php.ini կազմաձևման ֆայլը, որպեսզի թույլ տաք ֆայլեր վերբեռնել սերվեր:

PHP php.ini կազմաձևման ֆայլն ունի երեք տարբերակ՝ կապված ֆայլերը սերվերի վրա վերբեռնելու հետ.

  • file_uploads = Միացված - թույլ է տալիս ֆայլեր վերբեռնել սերվեր HTTP արձանագրության միջոցով;
  • upoad_tmp_dir = /tmp - սահմանում է տեղեկատու բեռնված ֆայլերի ժամանակավոր պահպանման համար;
  • upload_max_filesize = 2M - սահմանում է բեռնված ֆայլերի առավելագույն չափը:

Այսպիսով, ստեղծեք նոր ֆայլ, որը կոչվում է upload.php և պատճենեք հետևյալ կոդը դրա մեջ:

Եթե ​​ուշադիր նայեք ձևին, կտեսնեք թաքնված դաշտ

Այն ցույց է տալիս ստացված ֆայլի առավելագույն չափը բայթերով: Բայց այս արժեքը չպետք է վստահել, քանի որ դա միայն ծանուցում է և կարելի է հեշտությամբ շրջանցել: Ուստի նկատի ունեցեք դա։

Այն բանից հետո, երբ օգտատերը ընտրում է ֆայլը և սեղմում «Վերբեռնում» կոճակը, ֆայլի մասին ամբողջ տեղեկատվությունը, ինչպես նշվեց ավելի վաղ, տեղադրվում է $ _FILES զանգվածում, իսկ ֆայլը ինքնին տեղադրվում է սերվերի ժամանակավոր գրացուցակում, որը գտնվում է. նշված է php.ini-ում:

Քանի որ ֆայլի դաշտը կանչվել է անուն = "uploadFile", ապա $_FILES զանգվածը կպարունակի բանալիով ասոցիատիվ զանգված "Ներբեռնել ֆայլ" .

  • $_FILES[" uploadFile "]["name"] - ֆայլի անունը նախքան սերվեր ուղարկելը, օրինակ՝ pict.gif;
  • $_FILES[" uploadFile "]["size"] - ստացված ֆայլի չափը բայթերով;
  • $_FILES[" uploadFile "]["type"] - ստացված ֆայլի MIME տեսակը (եթե դիտարկիչը կարող է որոշել այն), օրինակ՝ image/gif, image/png, image/jpeg, text/html;
  • $_FILES[" uploadFile "]["tmp_name"] - պարունակում է ֆայլի անունը ժամանակավոր գրացուցակում, օրինակ՝ /tmp/phpV3b3qY;
  • $_FILES[" uploadFile "]["error"] - Սխալի կոդը, որը կարող է առաջանալ ֆայլ բեռնելիս:

Սցենարն ավարտվելուց հետո ժամանակավոր ֆայլը կջնջվի: Սա նշանակում է, որ մենք պետք է պատճենենք այն մեկ այլ վայրում, նախքան սցենարի ավարտը:

Այսպիսով, մենք պարզեցինք ալգորիթմը: Հիմա եկեք նայենք կոդը:

Առաջին հերթին մենք ստուգում ենք, արդյոք սեղմված է ուղարկել կոճակը:

If(isset($_POST["վերբեռնել"])) ()

If(is_uploaded_file($_FILES["uploadFile"]["tmp_name"])) (Կատարել գործողություն ֆայլի վրա) else (echo «Ֆայլը չի ​​վերբեռնվել»; )

Եթե ​​ֆայլը վերբեռնվել է HTTP POST-ի միջոցով, ապա մենք այն տեղափոխում ենք ժամանակավոր գրացուցակից մեզ անհրաժեշտ գրացուցակ: Դա արվում է՝ օգտագործելով move_uploaded_file ֆունկցիան, որն ընդունում է երկու պարամետր՝ վերբեռնվող ֆայլի անվանումը և այն ուղին, որտեղ կտեղափոխվի ֆայլը: Ֆայլի հաջող փոխանցման դեպքում այս ֆունկցիան կվերադարձնի true, հակառակ դեպքում՝ false:

If(move_uploaded_file($_FILES["uploadFile"]["tmp_name"], $uploadedFile)) (echo Ֆայլը վերբեռնվել է; ) else (echo Ֆայլը վերբեռնելիս սխալ է տեղի ունեցել;)

Մեր դեպքում, ֆայլի անունը սերվերի ժամանակավոր ֆայլի անունն է՝ $_FILES["uploadFile"]["tmp_name"], իսկ գրացուցակը, որտեղ ֆայլը կտեղափոխվի, վերևում հայտարարված $uploadedFile փոփոխականն է: սկրիպտում և պարունակում է նոր ֆայլի պահպանման վայրը:

$folder = "ուղի/դեպի/թղթապանակ/"; $uploadedFile = $թղթապանակ: բազային անունը ($_FILES ["uploadFile"]["name"]);

Իմ սեփական փորձից կարող եմ ասել, որ չարժե բնօրինակ ֆայլի անունը պահել սերվերում, ուստի այն կարող է վերանվանվել։ Դա անելու համար մենք կստեղծենք պատահական անուն մեր ֆայլի համար, և move_uploaded_file() ֆունկցիան կտեղափոխի և կվերանվանի մեր ֆայլը.

// Ստացեք ֆայլի ընդլայնում $file_ext = strtolower(strrchr($_FILES["uploadFile"]["name"],"")); // Ստեղծել պատահական թիվ $file_name = uniqid(rand(10000,99999)); // Սերվերի ուղին ձևավորեք $uploadedFile = $folder.$file_name.$file_ext;

Եվ վերջում ես ցուցակ կտամ հնարավոր սխալներորոնք տեղի են ունենում ֆայլեր սերվեր բեռնելիս: Որպես հիշեցում, սխալի կոդը պահվում է $_FILES[" uploadFile "]["error"] փոփոխականում՝

  • 0 - Սխալներ չեն եղել, ֆայլը հաջողությամբ վերբեռնվել է սերվեր:
  • 1- Ստացված ֆայլի չափը գերազանցել է առավելագույն թույլատրելի չափը, որը սահմանված է php.ini կազմաձևման ֆայլի upload_max_filesize հրահանգով:
  • 2- Վերբեռնված ֆայլի չափը գերազանցել է արժեքը MAX_FILE_SIZEՆշվածը HTML ձևով:
  • 3- Ներբեռնման ֆայլը ստացվել է միայն մասամբ:
  • 4- Ֆայլը չի ​​բեռնվել:
  • 6- Ժամանակավոր թղթապանակ չկա:
  • 7- Չհաջողվեց ֆայլեր գրել սկավառակի վրա:

Ինչպես տեսնում եք, ֆայլերի վերբեռնումը սերվեր կազմակերպելը այնքան էլ դժվար չէ։ Ավելի դժվար է ապահովել պահանջվող մակարդականվտանգություն, քանի որ ֆայլերի վերբեռնումը սերվեր կարող է օգտագործվել հարձակվողների կողմից սերվերի վրա հարձակվելու համար:

Օգտագործելով մեր սկրիպտը, հարձակվողը կկարողանա կամայական ֆայլեր վերբեռնել սերվեր, օրինակ, նա կկարողանա վերբեռնել php սկրիպտը սերվերի վրա, որը կարող է ռեկուրսիվ կերպով ջնջել ձեր բոլոր ֆայլերը սերվերի կամ PHP shell-ի վրա, այնպես որ, եթե դուք գրում եք. ձեր սեփական ֆայլերի վերբեռնիչը, ապա այս հարցին պետք է լուրջ վերաբերվել՝ ոչինչ բաց չթողնելով:

Մեր օրինակում ես ինձ նման խնդիր չեմ դրել, այլ միայն ցույց եմ տվել ֆայլերը սերվերում վերբեռնելու ամբողջ մեխանիզմը, բայց հաջորդ հոդվածում ես ձեզ ցույց կտամ, թե ինչպես ապահովել անվտանգության անհրաժեշտ մակարդակը:

Հավանաբար շատերն են հանդիպել «Ինչպե՞ս վերբեռնել ֆայլը սերվերում՝ օգտագործելով JS և JQuery» հարցին։
Եվ հավանաբար ոչ բոլորին է հաջողվել դա անել։ Իրականում ամեն ինչ այնքան էլ դժվար չէ, որքան թվում է։
Այս դասում ես նկարագրելու եմ ֆայլը սերվեր (հոսթինգ) վերբեռնելու գործընթացը:
Ajax տեխնոլոգիան օգտագործվում է բրաուզերի և վեբ սերվերի միջև տվյալների փոխանակման համար:
Բաղադրատոմսում օգտագործված jQuery-ի տարբերակը՝ 2.2.2.

Մենք ստեղծում ենք պարզունակ նշագրում html, գլխի և մարմնի պիտակներից:
Head թեգում դուք պետք է գրեք jquery գրադարանի ուղին:
Օրինակում ես օգտագործում եմ jquery google սերվերից:

Մարմնի պիտակում մենք ստեղծում ենք ձև, որը բաղկացած է մուտքային պիտակից և կոճակից:
Մուտքագրման տեսակը=«ֆայլ»-ը ընտրում է վերբեռնվող ֆայլը:
Ֆայլը փոխանցելու համար js կոդը գործարկելու համար անհրաժեշտ է կոճակի պիտակ:

Սահմանեք ձևը name = "uploader", enctype = "multipart/form-data", մեթոդ = "POST":
Ձևի անունը. name = "բեռնող"
Ինչպես կոդավորել ձևի տվյալները՝ enctype="multipart/form-data"
Տվյալների փոխանցման եղանակը՝ մեթոդ = "POST"

Ներկայացրե՛ք այս ֆայլը՝ Վերբեռնել

Բոլոր html և js նշագրման ծածկագրերը.
Ներկայացրե՛ք այս ֆայլը՝ Վերբեռնել

Եկեք անցնենք java script կոդը:
Ֆայլ ներկայացնելու համար դուք պետք է ներկայացնեք ամբողջ ձևը.
$(«ձև»).submit(function(e) (

Մենք կարդում ենք ձևի տվյալները փոփոխականի մեջ.
var formData = նոր FormData ($ (սա));

Հաջորդը, մենք օգտագործում ենք ajax տեխնոլոգիան տվյալների վեբ սերվերին փոխանցելու համար:
Եթե ​​ֆայլի փոխանցումը հաջող է, հաղորդագրություն կցուցադրվի թռուցիկ պատուհանում:
Եթե ​​սխալ է տեղի ունենում կամ ֆայլը բացակայում է, խնդրի տեքստով հաղորդագրություն կցուցադրվի:
$.ajax(( url: «file.php», տեսակ՝ «POST», տվյալներ՝ formData, async՝ false, հաջողություն՝ ֆունկցիա (msg) ( alarm(msg); ), սխալ՝ function(msg) ( alert( «Սխալ»); ), քեշ՝ կեղծ, բովանդակության տեսակը՝ կեղծ, գործընթացՏվյալներ՝ կեղծ ));

Ամբողջ java script կոդը՝ օգտագործելով jquery.

Այժմ սերվերի կողմում կա կոդ՝ POST հարցման մեթոդով ձևից տվյալներ ստանալու համար:

Մենք ստանում ենք կայքի արմատային գրացուցակը և թղթապանակ ենք նշանակում ֆայլեր վերբեռնելու համար.
$uploaddir = $_SERVER["DOCUMENT_ROOT"].DIRECTORY_SEPARATOR."uploads".DIRECTORY_SEPARATOR;

Վերբեռնված ֆայլի ընթերցում.
$uploadfile = $uploaddir: բազային անուն ($_FILES ["օգտվողի ֆայլ"]["անուն"]);

Ստուգեք, արդյոք ֆայլը բեռնված է:
Մուտքային տվյալներին համապատասխան՝ մենք ուղեկցող հաղորդագրություն ենք նշանակում։
Եթե ​​ֆայլը վերբեռնված չէ, վերբեռնեք $uploadfile-ում նշված գրացուցակում՝
if (move_uploaded_file($_FILES["userfile"]["tmp_name"], $uploadfile)) ($out = "Ֆայլը վավեր է և հաջողությամբ վերբեռնվել է։\n"; ) else ($out = "Ֆայլի վերբեռնման հնարավոր հարձակում !\ n";)

Երբ նշված գործողությունները կատարվում են, պատասխանը վերադարձվում է:

Ամբողջ կոդը php-ում.

Ամբողջական html կոդըներառյալ js:

Ներկայացրե՛ք այս ֆայլը՝ Վերբեռնեք $("form").submit(function(e) ( var formData = new FormData($(this)); $.ajax((url: "file.php", տիպ՝ "POST", տվյալներ՝ formData, async՝ false, հաջողություն՝ ֆունկցիա (msg) ( alert(msg); ), error: function (msg) ( alert ("Error!"); ), cache: false, contentType: false, processData: false ));e.preventDefault();));

Ներբեռնեք ֆայլը սկզբնական կոդով.

Բազմամասնական ձևեր

  • Փոստի ծառայությունների վեբ ինտերֆեյսներ, որոնք թույլ են տալիս նամակին ավելացնել կցորդ (կցել), և դրա համար նախ պետք է ֆայլը վերբեռնել սերվեր, և միայն դրանից հետո այն կարող է ավելացվել նամակին.
  • Ինտերակտիվ լուսանկարների պատկերասրահներ և ֆոտոալբոմներ, որոնք չեն կարող գոյություն ունենալ առանց սերվերի ֆայլեր վերբեռնելու մեխանիզմի.
  • Անվճար ծրագրային պորտալներ, որոնք օգտագործվում են տարբեր ծրագրերի միջև ֆայլեր փոխանակելու համար և այլն:

Ֆայլը վերբեռնվում է սերվեր՝ օգտագործելով բազմամասնական ձև, որն ունի ֆայլի վերբեռնման դաշտ: Enctype պարամետրը սահմանված է բազմամաս/ձև-տվյալների՝



Այսպիսի տեսք կունենա վերը նշված բազմաբնույթ ձևը (կարող եք փորձել օգտագործել այն՝ տեսնելու բազմաբնույթ ձևերի արդյունքը՝ մի փոքր ֆայլ վերբեռնելով սերվերում).

Բազմամասնական ձևերը սովորաբար օգտագործում են POST-ի ներկայացման մեթոդը: Ինչպես տեսնում եք նախորդ օրինակից, այս ձևն ունի երկու դաշտ.

  • Ֆայլի ընտրության դաշտ վերբեռնման համար;
  • Ֆայլի անունը նշելու դաշտը, որը այն պետք է ունենա սերվերում:

Բազմամասնական ձևերի մշակում

Նախքան սկսենք գրել բազմաբնույթ ձևի սկրիպտը, մենք պետք է խմբագրենք php.ini կազմաձևման ֆայլը՝ թույլ տալու ֆայլեր վերբեռնել սերվեր:

PHP php.ini կազմաձևման ֆայլն ունի երեք տարբերակ՝ կապված ֆայլերը սերվերի վրա վերբեռնելու հետ.

  • file_uploads=Միացված - թույլ է տալիս ֆայլեր վերբեռնել սերվեր HTTP արձանագրության միջոցով;
  • upload_tmp_dir=/tmp - սահմանում է տեղեկատու բեռնված ֆայլերի ժամանակավոր պահպանման համար;
  • upload_max_filesize=2M - սահմանում է բեռնված ֆայլերի առավելագույն չափը:

Եթե ​​ձեր վեբ սերվերը աշխատում է օպերացիոն համակարգ Linux, դուք պետք է վերագործարկեք ծառայությունը.

ծառայության httpd վերագործարկում

Ինչպե՞ս է PHP-ն մշակում բազմամասնական ձևերը: Ֆայլը ստանալուց հետո այն պահում է upload_tmp_dir ժամանակավոր գրացուցակում, ֆայլի անունը ընտրվում է պատահականության սկզբունքով։ Այնուհետև այն ստեղծում է չորս փոփոխական $_FILES գերգլոբալ զանգվածում: Այս զանգվածը պարունակում է տեղեկատվություն վերբեռնված ֆայլի մասին:

Վերբեռնված ֆայլերի համար սահմանված փոփոխականները կախված են PHP տարբերակից և ընթացիկ կոնֆիգուրացիայից: $_FILES սուպերգլոբալ զանգվածը հասանելի է PHP 4.1.0-ից: Եթե ​​կազմաձևման հրահանգը register_globals-ը դրված է վրա, համապատասխան անվանումներով փոփոխականները կհայտարարվեն լրացուցիչ։ Քանի որ 4.2.0 տարբերակը, register_globals տարբերակի լռելյայն արժեքն է անջատված է.

Մեր օրինակի $_FILES զանգվածի բովանդակությունը ներկայացված է ստորև: Նկատի ունեցեք, որ վերբեռնման ֆայլի անվանումն այստեղ ենթադրվում է ֆայլի ընտրության դաշտի համար՝ ըստ վերը նշված բազմամասի ձևի: Իհարկե, դաշտի անվանումը կարող է լինել ցանկացած բան:

  • $_FILES["uploadfile"]["name"] - ֆայլի անունը նախքան սերվեր ուղարկելը, օրինակ՝ pict.gif;
  • $_FILES["uploadfile"]["size"] - ստացված ֆայլի չափը բայթերով;
  • $_FILES["uploadfile"]["type"] - ստացված ֆայլի MIME տեսակը (եթե դիտարկիչը կարող է որոշել այն), օրինակ՝ image/gif, image/png, image/jpeg, text/html;
  • (այսպես մենք անվանեցինք ֆայլի վերբեռնման դաշտ) - պարունակում է ֆայլի անունը ժամանակավոր գրացուցակում, օրինակ՝ /tmp/phpV3b3qY;
  • $_FILES ["uploadfile"]["error"] - Սխալի կոդը, որը կարող է առաջանալ ֆայլ բեռնելիս: Բանալի [«սխալ»]ավելացվել է PHP 4.2.0-ում: Դուք կարող եք գտնել համապատասխան սխալի կոդերը

Սցենարն ավարտվելուց հետո ժամանակավոր ֆայլը կջնջվի: Սա նշանակում է, որ մենք պետք է պատճենենք այն մեկ այլ վայրում, նախքան սցենարի ավարտը: Այսինքն՝ ֆայլը սերվեր վերբեռնելու սկրիպտի ալգորիթմը հետևյալն է.

Եթե ​​սեղմված է «Ներկայացնել» կոճակը, ապա ֆայլն արդեն կբեռնվի սերվեր, և նրա անունը կլինի $_FILES["uploadfile"]["name"] փոփոխականում։ Այս դեպքում սկրիպտը պետք է անմիջապես պատճենի $_FILES["uploadfile"]["tmp_name"] անունով ֆայլը ինչ-որ գրացուցակում (այս գրացուցակում գրելու թույլտվություններ են պետք):

Ֆայլի պատճենումը կատարվում է copy() ֆունկցիայի միջոցով.

Օգտագործեք միայն copy() ֆունկցիան, այլ ոչ թե տեղափոխեք, քանի որ.

  • Ժամանակավոր ֆայլն ինքնաբերաբար կջնջվի;
  • Եթե ​​ժամանակավոր գրացուցակը գտնվում է այլ կրիչների վրա, կցուցադրվի սխալի հաղորդագրություն:

Ենթադրենք, մենք ուզում ենք ֆայլ վերբեռնել բեռնումների գրացուցակում, որը գտնվում է վեբ սերվերի արմատական ​​գրացուցակում (DocumentRoot գրացուցակում):

// Ստեղծեք գրացուցակ ամեն դեպքում: Եթե ​​այն արդեն ստեղծված է,
// մենք սխալի հաղորդագրություն չենք տեսնի, քանի որ օգտագործում ենք @ օպերատորը.

@mkdir («վերբեռնումներ», 0777);

// Պատճենել ֆայլը /tmp-ից վերբեռնումների համար
// Ֆայլի անունը կլինի նույնը, ինչ եղել է մինչև սերվեր ուղարկելը.

Պատճենել($_FILES["uploadfile"]["tmp_name"],"uploads/".basename($_FILES["uploadfile"]["name"]));

Linux-ում ամեն ինչ շատ ավելի բարդ է. մենք պետք է հաշվի առնենք բեռնումների գրացուցակի թույլտվությունները: Ամենայն հավանականությամբ, այս դեպքում mkdir() ֆունկցիան չի աշխատի, քանի որ մենք չունենք գրելու մուտք դեպի DocumentRoot գրացուցակ (սովորաբար /var/www/html կամ /home/httpd/html): Մուտք գործեք համակարգ որպես root, ստեղծեք բեռնումների գրացուցակ և փոխեք դրա սեփականատիրոջը և թույլտվությունները հետևյալ կերպ.

// Ստեղծեք բեռնումների գրացուցակը

// Սահմանեք apache-ի սեփականատիրոջ անունը և նրա խումբը, ինչպես նաև apache:

Chown apache:apache վերբեռնումներ

// Թույլ տալ բոլորին գրել (777) + կպչուն բիթի կարգավորում (1):

Chmod 1777 վերբեռնումներ

Ֆայլի չափը կարող է սահմանափակվել, ցանկության դեպքում կարող եք խմբագրել .htaccess ֆայլը և սահմանափակել մուտքը դեպի վերբեռնման գրացուցակ - նշեք կամ կոնկրետ օգտվողներ, ովքեր կարող են մուտք գործել գրացուցակ կամ IP հասցեներ:

Այժմ դուք կարող եք ֆայլեր վերբեռնել սերվեր:

PHP սկրիպտ գրել՝ ֆայլերը սերվեր վերբեռնելու համար

Բազմաթիվ ֆայլերի բեռնումը կարող է իրականացվել՝ օգտագործելով, օրինակ, մուտքային պիտակի անվան տարբեր արժեքներ:

Այն նաև հնարավորություն է տալիս ավտոմատ կերպով ստանալ տեղեկատվություն, որը կազմակերպված է մի քանի միաժամանակ ներբեռնված ֆայլերի մասին տեղեկատվության զանգվածի մեջ: Այս հատկությունն իրականացնելու համար օգտագործեք նույն շարահյուսությունը HTML ձևից զանգված ներկայացնելու համար, ինչ ընտրության և վանդակի մի քանի դաշտերի համար.


Ուղարկեք այս ֆայլերը.






Նման ձևի ներկայացման դեպքում $_FILES["userfile"] , $_FILES["userfile"]["name"] և $_FILES["userfile"]["size"] զանգվածները կսկսվեն սկզբնավորվել (մեջում: նույն կերպ, ինչպես նաև $HTTP_POST_FILES PHP 4.1.0 և ավելի վաղ տարբերակների համար): Եթե ​​register_globals կոնֆիգուրացիայի հրահանգը միացված է , ապա ուղեկցող գլոբալ փոփոխականները նույնպես կսկսվեն սկզբնավորվել: Այս փոփոխականներից յուրաքանչյուրը կլինի ստացված ֆայլերի համապատասխան արժեքների թվային ինդեքսավորված զանգված:

Ենթադրենք, որ /home/test/some.html և /home/test/file.bin ֆայլերը բեռնված են։ Այս դեպքում $_FILES["userfile"]["name"] փոփոխականը կունենա some.html արժեքը, իսկ $_FILES["userfile"]["name"] փոփոխականը կունենա file.bin արժեքը: Նմանապես, $_FILES["userfile"]["size"]-ը կպարունակի some.html ֆայլի չափը և այլն:

Փոփոխականներ $_FILES["userfile"]["name"] , $_FILES["userfile"]["tmp_name"] , $_FILES["userfile"]["size"] և $_FILES["userfile"]["type «] նույնպես նախաստորագրվելու է:

Եզրակացություն:

Ինչպես տեսնում եք, ֆայլերի վերբեռնումը սերվեր կազմակերպելը այնքան էլ դժվար չէ։ Ավելի դժվար է ապահովել անվտանգության անհրաժեշտ մակարդակը, քանի որ ֆայլերի վերբեռնումը սերվեր կարող է օգտագործվել հարձակվողների կողմից՝ սերվերի վրա հարձակվելու համար: Վերբեռնումների հետ աշխատելիս անվտանգության անհրաժեշտ մակարդակ ապահովելու մասին տեղեկությունների համար տե՛ս.



>
Եթե ​​ունեք ավելի շատ հարցեր կամ ինչ-որ բան պարզ չէ, բարի գալուստ մեր

Անշուշտ, դուք հաճախ եք վերբեռնում տարբեր ֆայլեր: Օրինակ՝ ֆորումում ավատարներ էին բեռնում, սոցցանցերում լուսանկարներ, վիդեոհոսթինգ կայքերում տարբեր տեսանյութեր, ֆայլերի փոխանակման ծառայությունների վրա՝ պարզապես ֆայլեր։ Եվ այս հոդվածում դուք կսովորեք, թե ինչպես վերբեռնել ֆայլերը սերվերում PHP-ով: PHP-ի միջոցով է, որ շատ դեպքերում դա իրականացվում է:

Առաջին բանը, որ պետք է սովորել, այն է, որ ինքնին HTML ձևը, որի մեջ տեղադրված է ֆայլը, չպետք է լինի բավականին սովորական, ահա այսպիսի ձևի HTML կոդի օրինակ.





Այստեղ բանալին «enctype» հատկանիշն է՝ «multipart/form-data» արժեքով։ Առանց դրա ոչինչ չի ստացվի։

«, որում մենք դեռ չենք վերբեռնի ֆայլը, այլ կանցնենք մի քանի կարևոր կետերի միջով, որոնք պետք է հաշվի առնել, հակառակ դեպքում անվտանգությունը կարող է տուժել.

Արդյունքում, դուք կտեսնեք $_FILES գլոբալ երկչափ զանգվածի բովանդակությունը.

  • անունը - վերբեռնված ֆայլի անվանումը:
  • տեսակ - վերբեռնված ֆայլի MIME-տեսակ: Սա, թերեւս, անվտանգության ամենակարևոր պարամետրն է: Եվ միշտ ֆայլեր ստանալիս պետք է ստուգել MIME-ի տեսակը, այլապես խնդիրներ չեք ունենա: Հաջորդ հոդվածում այս մասին ավելի մանրամասն կխոսենք։
  • tmp_name-ը ֆիզիկական ուղին է դեպի ժամանակավոր ֆայլ: Հենց այս վայրում է տեղադրվում ֆայլը, և միայն դրանից հետո մենք այն տեղափոխում ենք այլ վայր: Փաստորեն, ֆայլն արդեն վերբեռնվել է, և մենք պարզապես պետք է այն տեղափոխենք սերվերի ճիշտ թղթապանակ:
  • սխալ - սխալի կոդը: Եթե ​​0, ապա սխալներ չկան:
  • չափը - բեռնված ֆայլի չափը: Սա նաև սովորաբար օգտագործվող տարբերակ է և պետք է նաև ստուգվի՝ վերբեռնվածի չափը սահմանափակելու համար: Իհարկե, այս չափը սահմանափակվում է հենց սերվերի կողմից, սակայն ցանկացած նկարի համար այս չափը ակնհայտորեն չափազանց մեծ է (որպես կանոն, այն կազմում է 10 ՄԲ):

Եվ այս բոլոր տարբերակները առկա են յուրաքանչյուր բեռնված ֆայլի համար (որոնցից յուրաքանչյուրը զանգված է $_FILES երկչափ զանգվածում):

Այժմ եկեք ավարտենք ֆայլերի վերբեռնումը սերվեր PHP-ով, և դրա համար մենք կգրենք հետևյալ կոդը (""):

Այսինքն, նախ մենք սերվերի վրա դրեցինք ներբեռնված ֆայլի ուղին: Այստեղ մենք ցանկանում ենք ֆայլը տեղադրել «images» գրացուցակում՝ նույն անունով, ինչ նախկինում: Իսկ move_uploaded_file() ֆունկցիայի միջոցով մենք ֆայլը տեղափոխում ենք մեր ընտրած գրացուցակը իր ժամանակավոր պահեստից։

Այնուամենայնիվ, խնդրում ենք նկատի ունենալ, որ սա շատ կարևոր է: Ոչ մի դեպքում չպետք է օգտագործեք կոդը այս կերպ, այլապես ձեր կայքը լուրջ վտանգի տակ կհայտնվի: Փաստորեն, բացարձակապես ամեն ինչ կարելի է ներբեռնել այս պահին՝ ցանկացած գործարկվող ֆայլ, սցենար, HTML էջ և այլ շատ վտանգավոր բաներ: Հետևաբար, հրամայական է շատ ուշադիր ստուգել բեռնված ֆայլերը սերվեր: Եվ դա այն է, ինչ մենք պատրաստվում ենք անել հաջորդ հոդվածում: Քանի որ թեման շատ կարևոր է, խորհուրդ եմ տալիս բաժանորդագրվել թարմացումներին, որպեսզի բաց չթողնեք այս հոդվածը:

Այս հոդվածը ցույց է տալիս վեբ հավելվածների հիմնական խոցելիությունները սերվերում ֆայլեր վերբեռնելու համար և ինչպես խուսափել դրանցից: Հոդվածը պարունակում է շատ հիմունքներ, թե արդյոք դա կհետաքրքրի մասնագետներին: Բայց, այնուամենայնիվ, յուրաքանչյուր PHP ծրագրավորող պետք է իմանա սա:

Տարբեր վեբ հավելվածները թույլ են տալիս օգտվողներին վերբեռնել ֆայլեր: Ֆորումները թույլ են տալիս օգտվողներին վերբեռնել «ավատարներ»: Լուսանկարների պատկերասրահները թույլ են տալիս վերբեռնել լուսանկարներ: Սոցիալական լրատվամիջոցտրամադրել պատկերներ, տեսանյութեր և այլն վերբեռնելու տարբերակներ: Բլոգները թույլ են տալիս նորից վերբեռնել ավատարներ և/կամ պատկերներ:

Հաճախ ֆայլերի վերբեռնումն առանց անվտանգության համապատասխան հսկողության հանգեցնում է խոցելիության, որոնք ապացուցված են, որ իրական խնդիր են PHP վեբ հավելվածներում:

Շարունակվող թեստերը ցույց են տվել, որ շատ վեբ հավելվածներ ունեն անվտանգության բազմաթիվ խնդիրներ: Այս «անցքերը» հարձակվողներին տալիս են չարտոնված գործողություններ կատարելու լայն հնարավորություններ՝ սերվերի վրա ցանկացած ֆայլ դիտելուց և կամայական կոդի գործադրմամբ այն ներբեռնելուց։ Այս հոդվածը խոսում է անվտանգության հիմնական անցքերի և դրանցից խուսափելու մասին:

Այս հոդվածում ներկայացված օրինակների կոդը կարելի է ներբեռնել հետևյալ հասցեով՝
www.scanit.be/uploads/php-file-upload-examples.zip:

Եթե ​​ցանկանում եք դրանք օգտագործել, համոզվեք, որ ձեր օգտագործած սերվերը հասանելի չէ ինտերնետից կամ որևէ այլ հանրային ցանցից: Օրինակները ցույց են տալիս տարբեր խոցելիություններ, որոնք կարող են վտանգավոր լինել, եթե գործարկվեն արտաքին հասանելի սերվերի վրա:

Ֆայլի նորմալ վերբեռնում Ֆայլի վերբեռնումը սովորաբար բաղկացած է երկու անկախ գործառույթից՝ ֆայլերի ընդունում օգտատիրոջից և ֆայլերի ցուցադրում օգտագործողին: Երկու մասերն էլ կարող են խոցելիության աղբյուր լինել: Դիտարկենք հետևյալ կոդը (upload1.php).


Սովորաբար, օգտվողները ֆայլեր են վերբեռնում հետևյալ ձևի միջոցով.

< form name ="upload" action ="upload1.php" method ="POST" ENCTYPE ="multipart/form-data" >
Ընտրեք ֆայլը վերբեռնելու համար.< input type ="file" name ="userfile" >
< input type ="submit" name ="upload" value ="վերբեռնել" >

* Այս ելակետային կոդը ընդգծվել է Source Code Highlighter-ով:

Հարձակվողը չի օգտագործի այս ձևը: Նա կարող է գրել Perl-ի փոքրիկ սցենար (հնարավոր է ցանկացած լեզվով - թարգմանչի նշում), որը կկրկնօրինակի ֆայլեր վերբեռնելու օգտատիրոջ գործողությունները՝ ձեր ցանկությամբ ուղարկված տվյալները փոխելու համար:

Այս դեպքում վերբեռնումը պարունակում է անվտանգության մեծ անցք՝ upload1.php-ն օգտատերերին թույլ է տալիս կամայական ֆայլեր վերբեռնել կայքի արմատին։ Հարձակվողը կարող է վերբեռնել PHP ֆայլ, որը թույլ է տալիս կամայական կեղևի հրամանները կատարել սերվերում՝ վեբ սերվերի գործընթացի արտոնությամբ: Նման սցենարը կոչվում է PHP-Shell: Ահա այսպիսի սցենարի ամենապարզ օրինակը.

Եթե ​​այս սկրիպտը սերվերում է, ապա կարող եք կատարել ցանկացած հրաման հարցման միջոցով.
server/shell.php?command=any_Unix_shell_command

Ավելի առաջադեմ PHP պատյաններ կարելի է գտնել առցանց: Նրանք կարող են վերբեռնել կամայական ֆայլեր, կատարել SQL հարցումներ և այլն։

Ստորև ներկայացված Perl աղբյուրը վերբեռնում է PHP-Shell-ը սերվեր՝ օգտագործելով upload1.php:

#!/usr/bin/perl
օգտագործել LWP; # մենք օգտագործում ենք libwwwperl
օգտագործել HTTP::Request::Common;
$ua = $ua = LWP::UserAgent->new ;
$res = $ua-> հարցում (POST "http://localhost/upload1.php" ,
Content_Type => «ձևի տվյալներ»,
բովանդակություն => ,],);

Տպել $res->as_string();


* Այս ելակետային կոդը ընդգծվել է Source Code Highlighter-ով:

Այս սցենարն օգտագործում է libwwwperl, որը հարմար Perl գրադարան է, որը նմանակում է HTTP հաճախորդին:

Եվ ահա թե ինչ է տեղի ունենում, երբ այս սցենարը կատարվում է.

Հայց.

POST /upload1.php HTTP/1.1
TE՝ deflate,gzip;q=0.3
Միացում՝ TE, փակ
Հաղորդավար՝ localhost

Բովանդակության երկարությունը՝ 156

--xYzZY

Բովանդակություն-Տեսակ՝ տեքստ/պարզ

--xYzZY-

Պատասխան.
HTTP/1.1 200 OK
Ամսաթիվ՝ չորեքշաբթի, 13 հունիսի 2007թ., 12:25:32 GMT
Սերվեր՝ Apache

Բովանդակության երկարությունը՝ 48
Միացում՝ փակ
Բովանդակություն-տեսակ՝ տեքստ/html
Ֆայլը վավեր է և հաջողությամբ վերբեռնվեց:

Shell-ի սկրիպտը ներբեռնելուց հետո մենք կարող ենք ապահով կերպով գործարկել հրամանը՝ $ curl localhost/uploads/shell.php?command=id:
uid=81(apache) gid=81(apache) խմբեր=81(apache)

cURL-ը HTTP հրամանի տող հաճախորդ է, որը հասանելի է Unix-ում և Windows-ում: Սա շատ օգտակար գործիք է վեբ հավելվածների փորձարկման համար: cURL-ը կարելի է ներբեռնել curl.haxx.se-ից Բովանդակության տիպի ստուգում Վերը նշված օրինակը հազվադեպ է պատահում: Շատ դեպքերում ծրագրավորողները օգտագործում են պարզ ստուգումներ՝ համոզվելու համար, որ օգտվողները վերբեռնում են որոշակի տեսակի ֆայլեր: Օրինակ՝ օգտագործելով Content-Type վերնագիրը.

Օրինակ 2 (upload2.php):

 
Հոդվածներ Ըստթեմա:
Ո՞ր հակավիրուսն է դեռ ավելի լավը՝ NOD32-ը կամ Avast-ը
Համակարգիչների շատ օգտատերեր գուցե երբեք չեն էլ լսել ESET NOD32 հակավիրուսի մասին՝ համեմատած հակավիրուսային ծրագրերի հետ, ինչպիսիք են Doctor Web-ը կամ Kaspersky Anti-Virus-ը: Բայց դա պատճառ չէ դրան լուրջ չվերաբերվելու ու դրա մասին մոռանալու համար։ Ավելին
Ինչպես ստեղծել ընկերության լոգոն. այբուբենի առաջինից մինչև վերջին տառը ստեղծելու բոլոր նրբությունները Ինչպես հորինել ձեր սեփական խորհրդանիշը
Յուրաքանչյուր կայք, անկախ նրանից՝ դուք բացում եք առցանց խանութ, թե ստեղծում եք պարզ բլոգ, պետք է ինքնատիպություն տալ: Դա կարելի է անել բրենդինգի միջոցով կամ, ավելի պարզ, անհատական ​​լոգո ստեղծելով: Ինչպես գալ այստեղ
Հետաքրքիր գյուտեր տան և կյանքի համար Ինչպես կատարել գյուտ
Հնարքներ, հնարքներ Ստեղծագործությունն էլ ավելի ուրախացնելու համար իրենց արհեստի վարպետները մշտապես հորինում են տարբեր եղանակներ, որոնք օգնում են պարզեցնել և արագացնել աշխատանքի ընթացքը: Մենք ձեզ համար հավաքել ենք 30 գաղափարներ և խորհուրդներ ռուս և արտասահմանյան վարպետներից
Ինչպես կատարել շնորհանդես. Լավագույն գործիքներ և օգտակար խորհուրդներ
Յուրաքանչյուր ոք, ով այսօր ներկայացնում է պրեզենտացիա կամ նույնիսկ պարզ հաղորդագրություն, պետք է իմանա, թե ինչպես ճիշտ ներկայացնել: Ի վերջո, շնորհանդեսը արդյունավետ մուլտիմեդիա գործիք է, որն օգտագործվում է տարբեր հաղորդագրությունների կամ հաշվետվությունների ընթացքում որոշակի հստակությամբ: