Ukrycie nazwy ściąganego pliku

Czasami chcemy udostępnić ściąganie plików jednak nie chcemy udostępniać bezpośredniego linków do pliku.

Możemy zrobić plik przechodni download.php, który będzie przyjmował np. identyfikator pliku do ściągnięcia, na jego podstawie odczytamy lokalizacje pliku, odczytamy go i prześlemy do przeglądarki.

$file = $className->getFileByID( $_GET["id] );
header( "Cache-control: private" );
header( "Content-Type: application/octet-stream" );
header( "Content-Length: ".filesize( $file ) );
header( "Content-Disposition: attachment; filename=".basename( $file ) );
header( "Connection: Close" );
readfile( $file )

post_max_size a tablice $_POST i $_FILES

W przypadku gdy mamy formularz umożliwiający przesłanie danych (do bazy lub gdziekolwiek), który ma możliwość załączenia pliku przy walidacji powinniśmy uwzględnić sytuację gdy uploadowany plik(i) nie przekracza maksymalnego rozmiaru tablicy $_POST

Można sumować wartość poszczególnych plików $_FILES[„name”][„size”] i porownywać jej wielkość z wartością ustawioną w post_max_size w php.ini ale jest to rozwiązanie działające tylko na serwerze na którym się aktualnie pisze kod (inne serwer przecież mogą mieć inną konfigurację)

Ale jest lepsze rozwiązanie: Sprawdzamy czy tablica $_POST, którą otrzymaliśmy jest pusta i czy tablica $_FILES nie jest pusta. Jeżeli okaże się to prawdą to oznacza, że nastąpiła próba wgrania co najmniej 1 pliku i suma przekroczyła aktualną wartość post_max_size przez co zresetowała tabelę $_POST.
Zapisujemy błąd do sesji i przekierowywujemy na formularz.

if( ( is_array( $_POST ) && count( $_POST ) == 0 ) && ( is_array( $_FILES ) && count( $_FILES ) != 0 ) ) {
  $errors["MAX_FILE_SIZE"] = "Suma wielkości wgrywanych plików jest zbyt duża";
  $session->setVar( "errors", $errors );
  header( "Location: plik_z_formularzem.php" );
  exit;
}

Autmatyczny backup

Kopia zapasowa – przydatna rzecz, warto ją mieć, jednak człowiek niezbyt często o tym pamięta gdy wszystko działa poprawnie. W momencie gdy pada system myśl o dacie ostatniego backupa jest pierwszą myślą świtającą w głowie.
Po co się tak stresować, po co polegać na zawodnej ludzkiej pamięci, lepiej napisac skrypt i niech wszystko się samo wykonuje.
Synchronizujemy katalogi zawierające dane do backupa z aktualnym stanem danych zbackupowanych

rsync -avrz $HOME/workspace/* $HOME/backup/source/workspace/
rsync -avrz $HOME/thunderbird/* $HOME/backup/source/mail/
rsync -avrz $HOME/gg/* $HOME/backup/source/gg

Następnie tworzymy archiwum zawierające bieżącą date

currDate=$(date +%Y-%m-%d);
tar -cjf $HOME/backup/archive/backup-$currDate.tar.bz2 $HOME/backup/source/*

Tak przygotowane archiwum zgrywamy w bezpieczne miejsce (np. na inna maszynę), a następnie kasujemy tymczasowe archiwum.

rsync -avrz -e ssh $HOME/backup/archive/ bezpieczny@dysk:/home/users/xxx/backup/
rm $HOME/backup/archive/backup-$currDate.tar.bz2

Następnie należy jeszcze tylko zautomatyzować wywoływanie skryptu odpowiednim wpisem w cronie:

0 15 * * fri $HOME/prog/backup.sh

W tym przypadku skrypt będzie wywoływany co tydzień w piątek o godzinie 15, tak więc od tej pory co tydzień mogę spokojnie opuszczać stanowisko pracy na weekend będąc pewnym, że moje dane są bezpieczne.

****dodane****

Aby backup mógł wykonywać się automatycznie to połączenie z bezpieczny@dysk musi być trusted (łączenie z nim bez hasła). Jest wiele sposobów aby to wykonać np:
Na komputerze, z którego robisz backup wpisz:

ssh-keygen -t dsa

Naciśnij enter kilka razy.

W twoim katalogu domowym zostanie stworzony katalog .ssh zawierające potrzebne pliki. Następnie w konsoli wpisz polecenie

ssh bezpieczny@dysk ‘test -d .ssh || mkdir -m 0700 .ssh ; cat >> .ssh/authorized_keys && chmod 0600 .ssh/*’ < ~/.ssh/id_dsa.pub

Zostaniesz poproszony o wprowadzenie hasła na bezpieczny@dysk, wprowadź je. I to wszystko. Hasło zostanie zapamiętane.

Możesz teraz przetestować, powinieneś łączyć się przez ssh z bezpieczny@dysk bez podawania hasła.

ssh bezpieczny@dysk