ვებ სერვერზე PHP – თი ფაილებთან მუშაობა არაერთ სიურპრიზს გვთავაზობს, რაც ზოგჯერ საინტერესოა ზოგჯერ კი მართლა მოსაბეზრებელი
თუმცა არის ერთი საკითხი რაზეც ამჯერად შევაჩერებ თქვენს ყურადღებას.
სერვერზე ფაილებთან მუშაობა PHP – ს შესაბამისი ფუნქციებით(fopen, fwrite, touch და ა.შ) საკმაოზე უფრო მოუხერხებელია უსაფრთხოების დეტალების გამო. არავისთვის არ წარმოადგენს საიდუმლოს რომ ვებ სერვერზე განთავსებულ ფაილებს უნდა გააჩნდეთ შექმნის, ჩაწერის, წაკითხვისა და წაშლის შეზღუდვები.
ასეთ შემთხვევაში ფაილებთან მუშაობის ერთადერთ სწორ და ეფექტურ გზად რჩება PHP FTP მოდულის გამოყენება, ან soeket – ებზე დაყრდნობით შექმნილი შესაბამისი რეალიზაციის გამოყენება, რაც ფაქტიურად ერთი და იგივეა.
რატომ FTP? იმიტომ, რომ სწორედ FTP მომხმარებელს გააჩნია ფაილებთან წვდომის შესაბამისი პერმიშენები, განსხვავებით იმ მომხმარებლისგან რომელიც ტრადიცულად აქვს PHP – ს.
პრობლემა
რამდენადაც ყველასათვის ცონბილია ვებ აპლიკაცია მუშაობს ე.წ. DOCUMENT_ROOT – ის შიგნით. მაგ:
/home/code.ge/public_html
სწორედ ამ მისამართის ქვეშ არის განლაგებული ვებ აპლიკაციის ყველა ფაილი, თუმცა იგივეს ვერ ვიტყვით სერვერთან FTP კლიენტით დაკავშირების შემთხვევაში. როდესაც სერვერს ვუკავშირდებით FTP კლიენტით მისამართი განსხვავდება და ხელთ გვაქვს მსგავსი ტიპის მისამართი:
/
ასეთ შემთხვევაში ერთსა და იმავე ფაილთან აღნისნული მეთოდებით მუშაობისას მივიღებთ ორ განსხვავებულ მისამართს:
//ტრადიციული შემთხვევა /home/code.ge/public_html/dir/some-file.gif //FTP - ს კლიენტის გამოყენების შემთხვევაში /public_html/dir/some-file.gif
განსხვავება თვალსაჩიანოა?
ცხადია ფაილებთან მუშაობისას საჭიროა რაიმე კონსისტენტური გზის გამონახვა რომელიც ერთნაირად ეფექტურად იმუშავებს როგორც ზემოთხსენებული ჩვეულებრივი ფაილებთან სამუშაო ფუნქციების გამოყენებით, ასევე PHP – ს FTP გაფართოვების ფუნქციების გამოყენების მეშვეობით.
მარტივ შემთხვევაში ამ პრობლემის გადასაჭრელად უბრალოდ საკმარისია მსგავსი PHP კოდის დაწერა:
1 2 3 4 5 6 |
ამ შემთხვევაში ფაილებთან მუშაობისას გაუგებრობების თავიდან ასარიდებლად ყოველი ფაილის მისამართის წინ უბრალოდ შეგვიძლია “_DOC_ROOT” კონსტანტის გამოყენება, მაგ:
1 2 3 4 |
მაგრამ დამეთანხმებით ეს მიდგომა ყოველად მიუღებელია ისეთ შემთხვევაში როდესაც პროგრამა სხვადასხვა სერვერებზე გამოიყენება და ყოველ ჯერზე კონფიგურაციის ხელით კეთება ნამდვილად არასასიამოვნოა
გამოსავალი
სიზარმაციდან და პრაქტიკული მოსაზრებებიდან გამომდინარე საჭიროა პატარა კოდის დაწერა რომელიც ამ პრობლემას მოგვიგვარებს და ავტომატურად გამოთვლის მისამართებს ორივე შემთხვევისათვის:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | //მიმდინარე დირექტორია FTP კლიენტისათვის $pwd = ftp_pwd($conn); //ვინდოუსის შემთხვევაში დავიზღვიოთ თავი და შევცვალოთ მარცხენა სლეში მარჯვენათი $pwd = str_replace('\', '/', $pwd); //თუ მიმდინარე დირექტორია არ არის უბრალოდ "/", მოვაშალოთ თავსა და ბოლოში სლეშები if ($pwd !== '/') { $pwd = trim($pwd, '\/'); } //აპლიკაციის ინსტალაციის დირექტორია, იგულისხმება რომ იგი ავტომატურად გამოთვლილია სკრიპტის მიერ define('_APP_PATH', '/my-app-path'); //დავამუშავოთ ვებ სერვერის DOCUMENT_ROOT და მივამატოთ მას აპლიკაციის ინსტალაციის დირექტორია $docroot = preg_replace( array('~\\\~', '~^[a-z]:~i', '~^/|/$~'), array('/', '', ''), $_SERVER['DOCUMENT_ROOT'] ) . _APP_PATH; //დამხმარე ფუნქცია დროებითი მისამართის გენერაციისათვის function path($pwd, $path) { $tokens = array(); if ($pwd = trim($pwd, '\/')) { $tokens[] = $pwd; } $tokens[] = $path; return '/' . implode('/', $tokens); } //DOCUMENT_ROOT დავყოთ ნაწილებად $tokens = explode('/', $docroot); $apppath = null; //შევასრულოთ ftp_chdir ფუნქცია იქამდე სანამ იგი არ დაგვიბრუნებს "true" - ს while(ftp_chdir($conn, $apppath = path($pwd, implode('/', $tokens))) !== true) { //DOCUMENT_ROOT მასივიდან ყოველ იტერაციაზე ამოვაგდოთ მასივის დასაწყისში მყოფი ელემენტი array_shift($tokens); $apppath = null; } //გამოვბეჭდოთ გამოთვლილი დირექტორია echo $apppath; |
სულ ეს არის
ტეგები: PHP
@იოსებ, მე მგონი ამ თემას ეხება ჩემი პრობლემა და გთხოვ გამიმარტე ფუნქცია copy() ვერ აკოპირებს tmp -დან და ამ პრობლემას მიგდებს:Warning: copy() [function.copy]: open_basedir restriction in effect. File(/tmp/php3rSqEZ) is not within the allowed path(s): (/usr/local/www/data/gou.gol.ge) in /usr/local/www/data/gou.gol.ge/doc/test1.php on line 12 და რა შეილება და როგორ შეილება რო ეს პრობლემა მოგვარდეს ძალიან გთხოვ დამეხმარე რა