INFINIUS

Popravljanje prava direktorija i datoteka na web serveru

The Astronaut Twins
[Creative Commons Licensephoto credit: oskay]

Tko je ikad radio s nekim linux operativnim sustavom zna da su prava direktorija i datoteka važna za rad s dokumentima na sustavu. Na web serverima se naročito pazi oko ovih prava te je često uvjetovano da direktoriji i datoteke imaju postavljenu razinu sigurnosti preko ovog mehanizma. Ovdje priložene skripte će to postaviti za vas automatski; uz upozorenje – iako je razina prava koje skripta postavlja u većini slučajeva optimalna, za specijalne slučajeve (cache datoteke, izvršni cgi programi) će biti neprimjerena – stoga oprez i ne upotrebljavajte ih ako ne znate o čemu se radi.

Iako je postavljanje prava moguće i preko ftp programa, u slučaju većeg broja datoteka ovo može biti dugotrajan i dosadan posao što je i razlog upotrebe skripti.

Datoteku skripte je najjednostavnije postaviti pod nekim imenom, npr. fixmods.php u direktorij gdje je potrebno napraviti reda što se tiče prava direktorija i datoteka i pozvati je preko preglednika, a zadano postavljaju prava na 0644 za datoteke te 0755 za direktorije. Jednom pozvana preko preglednika, unutar direktorija u kojem se nalazi i rekurzivno u svim poddirektorijima postavlja definiranu razinu prava za datoteke i direktorije. Na kraju ispisuje popis svih datoteka i direktorija nad kojima su izvršene promjene kako bi mogli provjeriti da nešto nije pošlo po zlu.

Kao osnovnu razinu zaštite će ova skripta odbiti mijenjanje prava unutar cgi-bin direktorija (cgi izvršni programi):

<?php

  // fixmod v0.1
  // popravi prava datoteka i direktorija u trenutnom direktoriju (webserver)
	
  // chmod 0644 sve datoteke osim u cgi-bin.u  
  passthru('find . -type f ! -regex ".*/cgi-bin/.*" -print0 | xargs -0 chmod 0644');
  exec('find . -type f -print0 | xargs -0 ls -la', $files);
  echo "<pre>";
  print_r($files);
  echo "</pre>";

  // chmod 0755 sve direktorije
  passthru('find . -type d -print0 | xargs -0 chmod 0755');
  exec('find . -type d -print0 | xargs -0 ls -lad', $dirs);
  echo "<pre>";
  print_r($dirs);
  echo "</pre>";
  
?>

Gornja skripta upotrebljava exec i passthru php komande za obavljanje ovog posla, ako su slučajno te komande onemogućene na web serveru moguće je isto  postići i preko skripte predložene u Drupal Troubleshooting FAQ-u (malo promijenjena što se tiče prava i preskakanja direktorija u ovom primjeru):

<?php
file_fix_directory(dirname(__FILE__));

function file_fix_directory($dir, $nomask = array('.', '..', 'cgi-bin')) {
  if (is_dir($dir)) {
     // Try to make each directory
     if (@chmod($dir, 0755)) {
       echo "<p>Postavljen direktorij: " . $dir . "</p>";
     }
  }
  if (is_dir($dir) && $handle = opendir($dir)) {
    while (false !== ($file = readdir($handle))) {
      if (!in_array($file, $nomask) && $file[0] != '.') {
        if (is_dir("$dir/$file")) {
          // Recurse into subdirectories
          file_fix_directory("$dir/$file", $nomask);
        }
        else {
          $filename = "$dir/$file";
          // Try to make each file
          if (@chmod($filename, 0644)) {
            echo "<p>Postavljena datoteka: " . $filename . "</p>";
          }
        }
      }
    }
    closedir($handle);
  }

}
?>



Tagovi: , , ,

 

Komentari su zatvoreni.