Popravljanje prava direktorija i datoteka na web serveru

[
photo 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: apache, linux, php, prava



